5 votes

Converting a Map<String,Map<String,Integer>> to Map<String,Integer> using streams

Je voudrais convertir un Map> en un Map en utilisant des Stream.

Voici le hic (et pourquoi je n'arrive pas à le résoudre):

Je voudrais regrouper mes valeurs entières par les valeurs clés des maps correspondantes. Ainsi, pour clarifier :

J'ai des entrées comme celles-ci :

Entrée 1: ["A",["a",1]]

Entrée 2: ["B",["a",2]]

Entrée 3: ["B",["b",5]]

Entrée 4: ["A",["b",0]]

Je souhaite convertir cette structure en ce qui suit :

Entrée 1: ["a",3]

Entrée 2: ["b",5]

Je pense qu'avec la classe Collectors et les méthodes comme summingInt et groupingBy, vous devriez être en mesure d'accomplir cela. Cependant, je n'arrive pas à trouver la bonne méthode pour y parvenir.

Il convient de noter que toutes les Map internes sont garanties d'avoir toujours les mêmes clés, soit avec des valeurs Integer 0 ou > 0. (par exemple, "A" et "B" auront toujours les mêmes 5 clés l'une que l'autre) Tout ce que j'ai essayé jusqu'à maintenant n'a pas vraiment abouti à grand-chose. Je suis conscient que, s'il n'y avait pas la partie de la sommation, je pourrais procéder comme ceci :

Map map2 = new HashMap();
                map1.values().stream().forEach(map -> {
                    map2.putAll(map.entrySet().stream().collect(Collectors.toMap(entry -> entry.getKey(), entry -> entry.getValue())));
                });

Mais comment ajouter la partie de la sommation ?

8voto

Eran Points 35360

Ceci devrait fonctionner:

Créez d'abord un Stream des entrées de toutes les cartes internes, puis regroupez les entrées par clé et additionnez les valeurs ayant la même clé.

Map map2 = 
    map1.values()
       .stream()
       .flatMap(m -> m.entrySet().stream()) // créez un Stream de toutes les entrées 
                                           // de toutes les cartes internes
       .collect(Collectors.groupingBy(Map.Entry::getKey,
                                      Collectors.summingInt(Map.Entry::getValue)));

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