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.