J'essaie de trouver un moyen simple dans l'API de flux Java 8 pour faire le regroupement, je viens avec cette méthode complexe!
List<String> list = new ArrayList<>();
list.add("Hello");
list.add("Hello");
list.add("World");
Map<String, List<String>> collect = list.stream().collect(
Collectors.groupingBy(o -> o));
System.out.println(collect);
List<String[]> collect2 = collect
.entrySet()
.stream()
.map(e -> new String[] { e.getKey(),
String.valueOf(e.getValue().size()) })
.collect(Collectors.toList());
collect2.forEach(o -> System.out.println(o[0] + " >> " + o[1]));
J'apprécie votre contribution.
java
functional-programming
java-8
Muhammad Hewedy
la source
la source
Réponses:
Je pense que vous cherchez juste la surcharge qui en prend une autre
Collector
pour spécifier quoi faire avec chaque groupe ... et ensuiteCollectors.counting()
faire le comptage:Résultat:
(Il y a aussi la possibilité d'utiliser
groupingByConcurrent
pour plus d'efficacité. Quelque chose à garder à l'esprit pour votre vrai code, si ce serait sûr dans votre contexte.)la source
and then performing a reduction operation on the values associated with a given key using the specified downstream Collector
Map<String, Long> counted = list.stream() .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
, ce qui se passe exactement à ce stade et tout lien avec des explications supplémentaires associées au sujet qui pourrait être envoyéla source
Voici un exemple de liste d'objets
la source
Voici des options légèrement différentes pour accomplir la tâche à accomplir.
utilisant
toMap
:utilisant
Map::merge
:la source
Voici la solution simple de StreamEx
Réduisez le code passe-partout:
collect(Collectors.
la source
Si vous êtes prêt à utiliser une bibliothèque tierce, vous pouvez utiliser la
Collectors2
classe dans Eclipse Collections pour convertir leList
en unBag
fichierStream
. ABag
est une structure de données conçue pour le comptage .Production:
Dans ce cas particulier, vous pouvez simplement
collect
leList
directement dans un fichierBag
.Vous pouvez également créer le
Bag
sans utiliser deStream
en adaptant leList
avec les protocoles des collections Eclipse.ou dans ce cas particulier:
Vous pouvez également créer le sac directement.
A
Bag<String>
est comme aMap<String, Integer>
en ce sens qu'il garde en interne la trace des clés et de leur décompte. Mais, si vous demandez uneMap
clé qu'il ne contient pas, il reviendranull
. Si vous demandez à unBag
une clé qu'il ne contient pasoccurrencesOf
, il renverra 0.Remarque: je suis un committer pour les collections Eclipse.
la source