当前位置:   article > 正文

java List<Map> 相同key求和_java map 按key求和

java map 按key求和

遇到个需求,就是上两篇那个导出excel延申的:

java 利用poi根据excel模板导出数据(一)

java 利用poi根据excel模板导出数据(二)

没错,这几篇是连续剧

话不多说,直接进入主题

上面导出excel后,需要在文档数据末尾新增一行合计,页面的合计是前端自动计算的,导出时候试了下poi,以失败告终,于是就统计数据集合,然后把统计后的值add到list中去,当作数据一并导出。

由于我这个Map里面有25个key,一个一个写太费时间,于是写了个小循环。。。。。。。。

如有别的方法,热烈欢迎大佬指教!!!!

提示:

本文和项目没关系,纯list<Map>根据key汇总的demo

直接上代码

  1. List<Map<String, Object>> list = Lists.newArrayList();
  2. Map<String, Object> map1 = Maps.newHashMap();
  3. Map<String, Object> map2 = Maps.newHashMap();
  4. Map<String, Object> map3 = Maps.newHashMap();
  5. map1.put("a", 1);
  6. map1.put("b", 2);
  7. map1.put("c", 3);
  8. map2.put("a", 4);
  9. map2.put("b", 5);
  10. map2.put("c", 6);
  11. map3.put("a", 7);
  12. map3.put("b", 8);
  13. map3.put("c", 9);
  14. map3.put("d", 10);
  15. list.add(map1);
  16. list.add(map2);
  17. list.add(map3);
  18. // 求和后的map
  19. Map<String, Object> mapSum = Maps.newHashMap();
  20. // 循环list
  21. list.stream().map(item -> {
  22. // 遍历MAP
  23. item.forEach((k, v) -> {
  24. Object v1 = mapSum.get(k);
  25. if (v1 == null) {
  26. mapSum.put(k, v);
  27. } else {
  28. // 累加求和
  29. v1 = new Integer((((Integer) v1).intValue() + ((Integer) v).intValue()));
  30. mapSum.put(k, v1);
  31. }
  32. });
  33. return mapSum;
  34. }).collect(Collectors.toList()).get(0);
  35. // 追加mapSum
  36. list.add(mapSum);
  37. System.out.println(JSONObject.toJSONString(list));
  38. System.out.println(JSONObject.toJSONString(mapSum));

OK  结束!

有另外的方法请大佬指教!!!

20230214 修改

评论区大佬指点:

Map<String, Integer> result = list.stream() .flatMap(map -> map.entrySet().stream()) .collect(Collectors.groupingBy(Map.Entry::getKey, Collectors.summingInt(Map.Entry::getValue)));

利用flatMap 进行计算,flatMap和map类似,flatMap把嵌套集合,按照子集合的形式,统一放入到新的一个集合中去,扁平化管理,统计的时候就可以一行搞定不用手写for循环

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/木道寻08/article/detail/861950
推荐阅读
相关标签
  

闽ICP备14008679号