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.