27 votos

Unirse a una lista<String> dentro de un mapa</String>

Estoy tratando de convertir un Map<String, List<String>> a un Map<String, String> , donde el valor de cada clave es la cadena conjunta construida por unirse a todos los valores en la List en el mapa anterior, por ejemplo:

A -> ["foo", "bar", "baz"]
B -> ["one", "two", "three"]

debe convertirse en

A -> "foo|bar|baz"
B -> "one|two|three"

¿Cuál es la forma idiomática para hacerlo utilizando la API de secuencias Java 8?

40voto

Tagir Valeev Puntos 14218

Simplemente use String.join , no hay necesidad de crear la secuencia anidada:

Map<String, String> result = map.entrySet()
                            .stream()
                            .collect(toMap(
                                e -> e.getKey(), 
                                e -> String.join("|", e.getValue())));

29voto

Tunaki Puntos 2663

Usted puede utilizar Collectors.joining(delimiter) para esta tarea.

Map<String, String> result = map.entrySet()
                                .stream()
                                .collect(toMap(
                                    Map.Entry::getKey, 
                                    e -> e.getValue().stream().collect(joining("|")))
                                );

En este código, cada entrada en el mapa se recoge a un nuevo mapa donde:

  • la clave permanece igual
  • el valor, que es una lista, se recoge a un String por unir todos los elementos

6voto

muued Puntos 1096

Guayaba de Google tiene un buen método para esto:

com.google.common.collect.Maps.transformValues(map, x -> x.stream().collect(joining("|")));

utilizando java puro, esto debería funcionar:

map.entrySet().stream().collect(toMap(Entry::getKey, e -> e.getValue().stream().collect(joining("|"))));

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X