Java 8 stream 合并map 分组计算

Map<String, Map<String, Long>> map = new HashMap<>();

Map<String, Long> param1 = new HashMap<>();
param1.put("a", 100L);
param1.put("b", 200L);
param1.put("c", 500L);
map.put("A", param1);

Map<String, Long> param2 = new HashMap<>();
param2.put("a", 100L);
param2.put("b", 200L);
param2.put("c", 800L);
param2.put("d", 1000L);
map.put("B", param2);

System.out.println("map = " + map);

Map<String, Long> collect = map.values()
        .stream()
        .map(Map::entrySet)
        .flatMap(Set::stream)
        .collect(
                Collectors.groupingBy(
                        Map.Entry::getKey,
                        Collectors.summingLong(Map.Entry::getValue)
                )
        );


System.out.println("collect = " + collect);


List<Map.Entry<String, Long>> collect1 = map.values()
        .stream()
        .map(Map::entrySet)
        .flatMap(Set::stream)
        //.distinct()
        .collect(Collectors.toList());

System.out.println("collect1 = " + collect1);

Map<String, Long> collect2 = map.values()
        .stream()
        .map(Map::entrySet)
        .flatMap(Set::stream)
        .distinct()
        .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (f, n) -> n));

System.out.println("collect2 = " + collect2);
输出:
map = {A={a=100, b=200, c=500}, B={a=100, b=200, c=800, d=1000}}
collect = {a=200, b=400, c=1300, d=1000}
collect1 = [a=100, b=200, c=500, c=800, d=1000]
collect2 = {a=100, b=200, c=800, d=1000}

 

posted @ 2022-12-05 14:50  Bevis  阅读(1129)  评论(0编辑  收藏  举报