遇到个需求,就是上两篇那个导出excel延申的:
没错,这几篇是连续剧
话不多说,直接进入主题
上面导出excel后,需要在文档数据末尾新增一行合计,页面的合计是前端自动计算的,导出时候试了下poi,以失败告终,于是就统计数据集合,然后把统计后的值add到list中去,当作数据一并导出。
由于我这个Map里面有25个key,一个一个写太费时间,于是写了个小循环。。。。。。。。
如有别的方法,热烈欢迎大佬指教!!!!
提示:
本文和项目没关系,纯list<Map>根据key汇总的demo
直接上代码
List<Map<String, Object>> list = Lists.newArrayList();
Map<String, Object> map1 = Maps.newHashMap();
Map<String, Object> map2 = Maps.newHashMap();
Map<String, Object> map3 = Maps.newHashMap();
map1.put("a", 1);
map1.put("b", 2);
map1.put("c", 3);
map2.put("a", 4);
map2.put("b", 5);
map2.put("c", 6);
map3.put("a", 7);
map3.put("b", 8);
map3.put("c", 9);
map3.put("d", 10);
list.add(map1);
list.add(map2);
list.add(map3);
// 求和后的map
Map<String, Object> mapSum = Maps.newHashMap();
// 循环list
list.stream().map(item -> {
// 遍历MAP
item.forEach((k, v) -> {
Object v1 = mapSum.get(k);
if (v1 == null) {
mapSum.put(k, v);
} else {
// 累加求和
v1 = new Integer((((Integer) v1).intValue() + ((Integer) v).intValue()));
mapSum.put(k, v1);
}
});
return mapSum;
}).collect(Collectors.toList()).get(0);
// 追加mapSum
list.add(mapSum);
System.out.println(JSONObject.toJSONString(list));
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循环