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
Collector
para especificar qué hacer con cada grupo ... y luegoCollectors.counting()
hacer el recuento:Resultado:
(También existe la posibilidad de usar
groupingByConcurrent
para 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 Collector
Map<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
Collectors2
clase en Eclipse Collections para convertirList
a aBag
usando aStream
. ABag
es una estructura de datos creada para contar .Salida:
En este caso particular, puede simplemente
collect
laList
directamente en unaBag
.También puede crear el archivo
Bag
sin usar unStream
mediante la adaptación delList
protocolo 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 unaMap
clave que no contiene, volveránull
. Si solicita unaBag
clave que no contieneoccurrencesOf
, devolverá 0.Nota: Soy un committer para Eclipse Collections.
fuente