multiple groupingby fields example java java-8 grouping java-stream collectors

java - groupingby - ¿Cómo obtener un tipo personalizado en lugar de Entero al usar Collectors.summingInt?



java stream group by multiple fields (2)

Para cambiar ese Integer de Collectors.summingInt a una Duration , solo necesita reemplazar ese Collector con:

Collectors.collectingAndThen( Collectors.summingInt(t -> t.getDuration().toSecondOfDay()), Duration::ofSeconds )

Actualmente estoy creando un Map<String, Map<LocalDate, Integer>> como este, donde el Integer representa segundos:

Map<String, Map<LocalDate, Integer>> map = stream.collect(Collectors.groupingBy( x -> x.getProject(), Collectors.groupingBy( x -> x.getDate(), Collectors.summingInt(t -> t.getDuration().toSecondOfDay()) ) ));

¿Cómo podría crear un Map<String, Map<LocalDate, Duration>> ?


Si estuviera usando una Duration real para getDuration() (en lugar de LocalTime ), también podría sumar directamente la Duration de la siguiente manera:

Map<String, Map<LocalDate, Duration>> map = stream.collect(Collectors.groupingBy( MyObject::getProject, Collectors.groupingBy( MyObject::getDate, Collectors.mapping(MyObject::getDuration, Collectors.reducing(Duration.ZERO, Duration::plus)) ) ));

Con la ventaja de que también suma los nanosegundos, y podría generalizarse a otros tipos también.

Sin embargo, tenga en cuenta que crea muchas instancias de Duration intermedia que podrían tener un impacto en el rendimiento.