我目前正在创建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>>
?
答案 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
实例。