使用 Collectors.summingInt 时,如何获取自定义类型而不是 Integer?

2022-09-04 21:49:32

我目前正在创建一个这样的,其中表示秒:Map<String, Map<LocalDate, Integer>>Integer

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

我怎么能创建一个?Map<String, Map<LocalDate, Duration>>


答案 1

要将其从 更改为 ,您只需将其替换为:IntegerCollectors.summingIntDurationCollector

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

答案 2

如果您使用实际的 for (而不是 ),则还可以直接对 求和 ,如下所示:DurationgetDuration()LocalTimeDuration

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))
        )
));

它的优点是它也对纳秒求和,也可以推广到其他类型。

但请注意,它会创建许多中间实例,这些实例可能会对性能产生影响。Duration