Java流对地图列表的值求和 [英] Java streams sum values of a List of Maps

查看:63
本文介绍了Java流对地图列表的值求和的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想确定行"中或更行"中的列":建立诸如List>行之类的地图列表的总和

i want to determine the of the "columns" in "rows" or or better: Build sum of a list of maps like List> rows

是否有可能对每个不同的列的所有值求和?该函数应返回一个Map,该列的键为键,所有值的总和为value.

Is it somehow possible to sum all values of each distinct column? The function shall return a Map with the column as key and the sum of all values as value.

summMap.get("columname")

假设我具有以下地图列表:

Let's assume i have the following list of maps:

List<Map<String, Long>> mapList = new ArrayList();
Map<String, Object> map1 = new HashMap<>();
Map<String, Object> map2 = new HashMap<>();
Map<String, Object> map3 = new HashMap<>();
map1.put("col1", 90);
map1.put("col2", 50);
map1.put("col3", 10);
map2.put("col1", 90);
map2.put("col2", 50);
map2.put("col3", 10);
map3.put("col1", 90);
map3.put("col2", 50);
map3.put("col3", 10);
mapList.add(map1);
mapList.add(map2);
mapList.add(map3);
Map<String, Long> sum = mapList.stream().distinct().sum() // Example
// result i'm awaiting/expecting
Long sumVal1 = sum.get("col1"); // 270
Long sumVal2 = sum.get("col2"); // 150
Long sumVal3 = sum.get("col3"); // 30

长sumVal = sum.get("col1");

Long sumVal = sum.get("col1");

推荐答案

这是简单的解决方案,它将根据您的要求给出结果:

Here is the simple solution, it will give the result as per your requirement:

List<Map<String, Long>> mapList = new ArrayList();
Map<String, Long>       map1    = new HashMap<>();
Map<String, Long>       map2    = new HashMap<>();
Map<String, Long>       map3    = new HashMap<>();
map1.put("col1", 90L);
map1.put("col2", 50L);
map1.put("col3", 10L);
map2.put("col1", 90L);
map2.put("col2", 50L);
map2.put("col3", 10L);
map3.put("col1", 90L);
map3.put("col2", 50L);
map3.put("col3", 10L);
mapList.add(map1);
mapList.add(map2);
mapList.add(map3);

Map<String, Long> sum = new HashMap<>();
mapList.forEach(map -> map.keySet().forEach(
                s -> {
                    mapList.stream()
                           .collect(Collectors.groupingBy(foo -> s,
                                Collectors.summingLong(foo -> map.get(s)))).forEach(
                                    (id, sumTargetCost) ->
                                            sum.put(s, sumTargetCost)
                    );
                }

));

Long sumVal1 = sum.get("col1"); // 270
Long sumVal2 = sum.get("col2"); // 150
Long sumVal3 = sum.get("col3"); // 30

System.out.println("SumVal1: " + sumVal1 + ", SumVal2: " + sumVal2 + ", SumVal3: " + sumVal3);

这篇关于Java流对地图列表的值求和的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆