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}