首页 > 解决方案 > 将列表转换为地图的地图

问题描述

我有一个包含以下字段的对象列表:

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 来实现这一点?

标签: javacollectionsjava-stream

解决方案


如果你的类看起来像这样带有 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)));

推荐阅读