需求:
将list集合中的et0和et1均相等的Map对象分别取出来,把et3,et4,et5的值均加和合并到一起。
如图:
1.将长度为50的集合按照et0和et1均相等划分出来了16个map对象。
2.以map集合中第一个数据为例
将Map的value集合中的三个Map对象中的et3、et4、et5加和合并。最终想得到的是如下的值,可以看到et3、et4、et5为上面三个的加和。
代码如下
public static void main(String[] args) {
List<Map<String, BigDecimal>> list = new ArrayList<>();
Map<String, BigDecimal> map = null;
for (int i = 0; i < 50; i++) {
map = new HashMap<>();
for (int j = 0; j < 6; j++) {
Random random = new Random();
map.put("et" + j, new BigDecimal("" + random.nextInt(4)));
}
list.add(map);
}
System.out.println(JSON.toJSONString(list));
List<String> list1 = new ArrayList<>();
list1.add("et3");
list1.add("et4");
list1.add("et5");
Map<String, List<Map<String, BigDecimal>>> collect = list.stream().collect(Collectors.groupingBy(i -> i.get("et0").toString() + i.get("et1").toString(), Collectors.toList()));
//图片1、2处断点
System.out.println(JSONObject.toJSONString(collect));
List finalList = new ArrayList();
collect.forEach((k, v) -> {
if (v.size() == 1) {
finalList.add(v);
} else {
Map<String, BigDecimal> map1 = v.get(0);
for (int i = 1; i < v.size(); i++) {
for (String s : list1) {
BigDecimal decimal = map1.get(s);
map1.put(s, decimal.add(v.get(i).get(s)));
}
}
finalList.add(map1);
}
});
//图片3处断点
System.out.println(JSONObject.toJSONString(finalList));
}