背景
我有一个地图列表,看起来大致像这样:
[
{
"name": "A",
"old": 0.25,
"new": 0.3
},
{
"name": "B",
"old": 0.3,
"new": 0.35
},
{
"name": "A",
"old": 0.75,
"new": 0.7
},
{
"name": "B",
"old": 0.7,
"new": 0.60
}
]
我希望输出结果看起来像这样:
{
"A": {
"old": 1,
"new": 1
},
"B": {
"old": 1,
"new": 0.95
}
}
...其中与每个相关条目相关的old
和new
的值被求和。
列表映射数据类型为List<Map<String, Object>>
,因此输出应为Map<String, Map<String, Double>>
。
我尝试过的方法
通过绘制一些图表、阅读文档并进行试错,我得出了以下结论:
data.stream()
.collect(
Collectors.groupingBy(entry -> entry.get("name"),
Collectors.summingDouble(entry ->
Double.parseDouble(entry.get("old").toString())))
);
生成一个类型为Map<String, Double>
的对象,其中输出是
{
"A": 1,
"B": 1
}
对于“旧值”的求和,我无法将其转换为地图的地图。类似于这样:
对于“旧值”的求和,但我无法完全将它转换成一个映射到映射的模式。类似于这样:
data.stream()
.collect(
Collectors.groupingBy(entry -> entry.get("name"),
Collectors.mapping(
Collectors.groupingBy(entry -> entry.get("old"),
Collectors.summingDouble(entry ->
Double.parseDouble(entry.get("old").toString())
)
),
Collectors.groupingBy(entry -> entry.get("new"),
Collectors.summingDouble(entry ->
Double.parseDouble(entry.get("new").toString())
)
)
)
)
);
由于Collectors.mapping()
只接受一个映射函数和一个下游收集器,所以它无法运行。但我不知道如何一次映射两个值。
是否有其他函数可以创建两个不同值的映射?非常感谢任何关于更好方法的建议。
name
、old
和new
封装在一个单独的类中,可以简化您的工作,您能否提取它呢? - Nisarg Patil