Agrupe contando en Java 8 API de secuencia

Intento encontrar una manera simple en la API de la secuencia de Java 8 para hacer la agrupación. ¡Salgo con esta manera compleja!

List list = new ArrayList(); list.add("Hello"); list.add("Hello"); list.add("World"); Map<String, List> collect = list.stream().collect( Collectors.groupingBy(o -> o)); System.out.println(collect); List 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])); 

Aprecio tu aporte.

Creo que solo está buscando la sobrecarga que necesita otro Collector para especificar qué hacer con cada grupo … y luego Collectors.counting() para hacer el recuento:

 import java.util.*; import java.util.stream.*; class Test { public static void main(String[] args) { List list = new ArrayList<>(); list.add("Hello"); list.add("Hello"); list.add("World"); Map counted = list.stream() .collect(Collectors.groupingBy(Function.identity(), Collectors.counting())); System.out.println(counted); } } 

Resultado:

 {Hello=2, World=1} 

(También existe la posibilidad de usar groupingByConcurrent para mayor eficiencia. Algo a tener en cuenta para su código real, si fuera seguro en su contexto).

  List list = new ArrayList<>(); list.add("Hello"); list.add("Hello"); list.add("World"); Map> collect = list.stream().collect( Collectors.groupingBy(o -> o)); System.out.println(collect); collect.entrySet().forEach(e -> System.out.println(e.getKey() + " >> " + e.getValue().size())); 

Aquí está la solución simple de StreamEx

 StreamEx.of(list).groupingBy(Function.identity(), Collectors.countingInt()); 

Reduce el código repetitivo: collect(Collectors.

Aquí hay un ejemplo para la lista de Objetos

 Map requirementCountMap = requirements.stream().collect(Collectors.groupingBy(Requirement::getRequirementType, Collectors.counting())); 

Aquí hay opciones ligeramente diferentes para llevar a cabo la tarea en cuestión.

usando toMap :

 list.stream() .collect(Collectors.toMap(Function.identity(), e -> 1, Math::addExact)); 

usando Map::merge :

 Map accumulator = new HashMap<>(); list.forEach(s -> accmulator.merge(s, 1, Math::addExact));