Eu tento encontrar uma maneira simples na API de fluxo Java 8 para fazer o agrupamento, e saio dessa maneira complexa!
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]));
Agradeço sua opinião.
java
functional-programming
java-8
Muhammad Hewedy
fonte
fonte
Respostas:
Eu acho que você está apenas procurando a sobrecarga que leva outro
Collector
para especificar o que fazer com cada grupo ... e depoisCollectors.counting()
fazer a contagem:Resultado:
(Também há a possibilidade de usar
groupingByConcurrent
para obter mais eficiência. Algo a ter em mente para o seu código real, se for seguro no seu contexto.)fonte
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()));
, o que exatamente está acontecendo neste momento e quaisquer links com mais explicações associadas ao tópico que poderia ser enviadofonte
Aqui está um exemplo para a lista de objetos
fonte
Aqui estão opções ligeiramente diferentes para realizar a tarefa em questão.
usando
toMap
:usando
Map::merge
:fonte
Aqui está a solução simples da StreamEx
Reduza o código padrão:
collect(Collectors.
fonte
Se você estiver aberto para usar uma biblioteca de terceiros, poderá usar a
Collectors2
classe em Coleções do Eclipse para convertê-laList
em umaBag
usando aStream
. ABag
é uma estrutura de dados criada para a contagem .Resultado:
Nesse caso em particular, você pode simplesmente
collect
oList
diretamente para aBag
.Você também pode criar o
Bag
sem usar aStream
, adaptando oList
com os protocolos Eclipse Collections.ou neste caso particular:
Você também pode simplesmente criar a bolsa diretamente.
A
Bag<String>
é como umMap<String, Integer>
, pois ele internamente controla as chaves e suas contagens. Mas, se você solicitar umaMap
chave que não contenha, ela retornaránull
. Se você solicitar umaBag
chave, ela não conterá o uso deoccurrencesOf
, ela retornará 0.Nota: Sou um colaborador das Coleções Eclipse.
fonte