Java 8 arroyos - fusionan una colección de mapas

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, m3como 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);

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=222859&siteId=1
Recomendado
Clasificación