27 votes

Rejoindre une liste <String> à l'intérieur d'une carte

J'essaie de convertir un Map<String, List<String>> en Map<String, String> , où la valeur de chaque clé est la chaîne commune créée en joignant toutes les valeurs dans le List dans la carte précédente, par exemple:

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

devrait être converti en

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

Quelle est la manière idiomatique de le faire en utilisant l'API Java 8 Streams?

40voto

Tagir Valeev Points 14218

Utilisez simplement String.join , pas besoin de créer le flux imbriqué:

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

29voto

Tunaki Points 2663

Vous pouvez utiliser Collectors.joining(delimiter) pour cette tâche.

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

Dans ce code, chaque entrée de la carte est collectée sur une nouvelle carte où:

  • la clé reste la même
  • la valeur, qui est une liste, est collectée en String en joignant tous les éléments

6voto

muued Points 1096

Google Guava a une belle méthode d'aide pour cela:

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

en utilisant du java pur, cela fonctionnerait:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X