fbielejec:
Digamos que tengo un método con una firma siguiente:
Map<String, String> merge (String[][] ... maps)
Se necesita un número (variadic) de arrays de dos tenues que representan asignaciones de, por ejemplo:
String[][] m1 = new String[][] {
{"k1", "a"},
{"k2", "b"}
};
String[][] m2 = new String[][] {
{"k1", "a"},
{"k2", "b"},
{"k3", "c"}
};
String[][] m3 = new String[][] {
{"k1", "x"},
{"k2", "b"}
};
Ahora puedo fusionar dos de los mapas de izquierda a derecha como esto:
Map<String, String> m1 = Stream.of(map1).collect(Collectors.toMap(k -> k[0], v -> v[1]));
Map<String, String> m2 = Stream.of(map2).collect(Collectors.toMap(k -> k[0], v -> Optional.ofNullable(v[1]).orElse("null")));
m1.forEach((key, value) -> m2.merge(key, value, (v1, v2) -> v1));
Pero, ¿cómo puedo ir sobre la fusión de una serie de tales variadic matriz de mapas, de manera que después de pasar m1, m2, m3
como se definió anteriormente, el resultado es:
String[][] m3 = new String[][] {
{"k1", "x"},
{"k2", "b"}
{"k3", "c"}
};
shmosel:
Es muy sencillo, si estoy entendiendo bien su pregunta. Usted acaba de flatMap todas las entradas y recoger al mapa, con una función de combinación que selecciona el valor más adelante:
Map<String, String> merge (String[][] ... maps) {
return Arrays.stream(maps)
.flatMap(Arrays::stream)
.collect(Collectors.toMap(a -> a[0], a -> a[1], (a, b) -> b));
}
Si desea volver a convertirlo en una matriz, que puede hacer
String[][] m3 = merge(maps)
.entrySet()
.stream()
.map(e -> new String[] { e.getKey(), e.getValue() })
.toArray(String[][]::new);