Intento encontrar una manera simple en la API de transmisión Java 8 para hacer la agrupación, ¡salí con esta forma compleja!
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]));
Agradezco tu aporte.
                    
                        java
                                functional-programming
                                java-8
                                
                    
                    
                        Muhammad Hewedy
fuente
                
                fuente

Respuestas:
Creo que solo está buscando la sobrecarga que requiere otra
Collectorpara especificar qué hacer con cada grupo ... y luegoCollectors.counting()hacer el recuento:Resultado:
(También existe la posibilidad de usar
groupingByConcurrentpara una mayor eficiencia. Algo a tener en cuenta para su código real, si fuera seguro en su contexto).fuente
and then performing a reduction operation on the values associated with a given key using the specified downstream CollectorMap<String, Long> counted = list.stream() .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));, qué está sucediendo exactamente en este momento y cualquier enlace con una explicación adicional asociada con el tema que podría enviarsefuente
Aquí hay un ejemplo para la lista de objetos
fuente
Aquí hay opciones ligeramente diferentes para realizar la tarea en cuestión.
utilizando
toMap:utilizando
Map::merge:fuente
Aquí está la solución simple de StreamEx
Reduzca el código repetitivo:
collect(Collectors.fuente
Si está abierto a usar una biblioteca de terceros, puede usar la
Collectors2clase en Eclipse Collections para convertirLista aBagusando aStream. ABages una estructura de datos creada para contar .Salida:
En este caso particular, puede simplemente
collectlaListdirectamente en unaBag.También puede crear el archivo
Bagsin usar unStreammediante la adaptación delListprotocolo Eclipse Collections.o en este caso particular:
También puede crear la bolsa directamente.
A
Bag<String>es como unMap<String, Integer>en que internamente realiza un seguimiento de las teclas y sus cuentas. Pero, si solicita unaMapclave que no contiene, volveránull. Si solicita unaBagclave que no contieneoccurrencesOf, devolverá 0.Nota: Soy un committer para Eclipse Collections.
fuente