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

时间:2017-05-31 13:04:26

标签: java java-8 grouping java-stream collectors

我目前正在创建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>>

2 个答案:

答案 0 :(得分:9)

要将function select(arr, obj) { var myObj = {}; for(var i = 0; i <= arr.length; i++){ arr[i] = obj[]; } } var arr = ['a', 'c', 'e']; var obj = { a: 1, b: 2, c: 3, d: 4 }; var output = select(arr, obj); console.log(output); // --> IT MUST RETURN { a: 1, c: 3 } Integer更改为Collectors.summingInt,您只需将Duration替换为:

Collector

答案 1 :(得分:2)

如果您使用实际Duration代替getDuration()(而不是LocalTime),您还可以直接汇总Duration,如下所示:

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实例。