【发布时间】:2018-10-04 16:35:33
【问题描述】:
背景
我有一个看起来像这样的地图列表:
[
{
"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
}
对于old 值的总和。但是,我无法将其完全转换为地图地图。像这样的:
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封装在一个单独的类中可以简化您的工作,您是否可以提取它?
标签: java lambda java-8 java-stream