List<Map<String, BigDecimal>> = [{month=1, num=1}, {month=2, num=3}, {month=3, num=1},{month=2, num=13}, {month=3, num=11}, {month=1, num=62}]
private static List<Map<String, BigDecimal>> mergeAndSum(List<Map<String, BigDecimal>> allData) {
return allData.stream().collect(Collectors.toMap(
map -> String.valueOf(map.get("month")),
map -> map,
(oldMap, newMap) -> {
BigDecimal oldNUM= oldMap.get("num");
BigDecimal newNUM = newMap.get("num");
oldMap.put("num", oldTCO2.add(newnum));
return oldMap;
}))
.values().stream()
.collect(Collectors.toList());
}
-
Stream化输入列表:首先,使用
allData.stream()
将输入的List<Map<String, BigDecimal>>
转换为一个Stream流。 -
使用Collectors.toMap进行收集:
- 键提取器:
map -> String.valueOf(map.get("month"))
,将每个内部Map
中的"month"键对应的值(假设为Integer
类型)转换为String
,作为新Map
的键。 - 值提取器:
map -> map
,直接使用每个内部Map
作为新Map
的值。 - 合并函数:
(oldMap, newMap) -> {...}
,当遇到相同键时,执行此函数进行合并操作。具体步骤如下:- 获取旧
Map
(oldMap
)中"num"键对应的BigDecimal
值oldNum
。 - 获取新
Map
(newMap
)中"num"键对应的BigDecimal
值new
num。 - 将两个
BigDecimal
值相加,结果存储回旧Map
的"tco2"键中:oldMap.put("
num", old
num.add(new
num))
。 - 返回合并后的旧
Map
:return oldMap;
- 获取旧
- 这个过程将所有输入数据合并到一个新的
Map<String, Map<String, BigDecimal>>
中,其中键为月份字符串,值为包含更新后"num"值的内部Map
。
- 键提取器:
-
提取合并后Map的值列表:调用
.values().stream()
获取合并后Map
的所有值(即内部Map
),然后使用Collectors.toList()
将这些值(内部Map
)收集到一个新的List<Map<String, BigDecimal>>
中。
最终,mergeAndSum方法返回一个列表,其中包含了合并并累加"num"值后的各个月份排放数据。例如,如果输入列表中有两个或更多月份的数据重叠,这些数据的"tco2"值会在合并过程中被相加,形成一个汇总后的月度排放数据列表。