java - 将列表转换为地图的地图
问题描述
我有一个包含以下字段的对象列表:
public final UUID uuid;
public final LocalDate date;
public final long value;
我想把它转换成,Map<UUID, Map<LocalDate, Long>>
但同时我需要按日期对值求和。
所以有这样的数据:
UUID | LocalDate | Long
uuid1| 2012-12-10| 100
uuid1| 2012-12-11| 200
uuid2| 2012-12-10| 300
uuid2| 2012-12-10| 200
我希望有:
uuid1: {
[2012-12-10, 100],
[2012-12-11, 200]
},
uuid2: {
[2012-12-10, 500]
}
是否可以使用 Stream API 来实现这一点?
解决方案
如果你的类看起来像这样带有 setter 和 getter
public class SomeObject {
public UUID uuid;
public LocalDate date;
public Long value;
您可以使用Collectors.groupingBy
接受分类器函数和另一个收集器的变体按 uuid 分组并收集要映射的对象
Map<UUID, Map<LocalDate, Long>> collect = someObjects.stream()
.collect(Collectors.groupingBy(SomeObject::getUuid,
Collectors.toMap(SomeObject::getDate, SomeObject::getValue,Long::sum)));