有个需求是合并两个map,并对相同key的元素的value进行求和。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 
 | public static void main(String[] args) {
 List<String> list = new ArrayList<>();
 list.add("A");
 list.add("B");
 list.add("C");
 list.add("B");
 list.add("B");
 list.add("C");
 list.add("A");
 list.add("D");
 
 Map<String, Long> map = list.stream().collect(Collectors.groupingBy(k -> k, Collectors.counting()));
 System.out.println("map: " + map);
 
 List<String> list2 = new ArrayList<>();
 list2.add("B");
 list2.add("B");
 list2.add("B");
 list2.add("B");
 list2.add("B");
 list2.add("C");
 list2.add("A");
 
 Map<String, Long> map2 = list2.stream().collect(Collectors.groupingBy(k -> k, Collectors.counting()));
 
 System.out.println("map2: " + map2);
 
 map2.forEach((k, v) -> map.merge(k, v, (v1, v2) -> v1 + v2));
 
 System.out.println("map: " + map);
 }
 
 | 
上面这种方法会修改map的值,还有一种方法不会修改map的值,会新生成一个map。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 
 | public class MapMergeDemo {
 public static void main(String[] args) {
 
 HashMap<String, Integer> m = new HashMap<>();
 HashMap<String, Integer> m2 = new HashMap<>();
 
 m.put("apple", 2);
 m.put("pear", 3);
 m2.put("apple", 9);
 m2.put("banana", 6);
 
 
 Map<String, Long> mapResult = Stream.of(m, m2)
 .flatMap(map -> map.entrySet().stream())
 .collect(Collectors.groupingBy(Map.Entry::getKey,
 Collectors.summingLong(Map.Entry::getValue)));
 
 System.out.println(mapResult);
 
 }
 }
 
 | 
假如说有以下List,List的元素存放的数据为:苹果:2, 香蕉:3 类似这样的数据。要统计每类水果的数量。
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 
 | Map<String, Integer> fruitCountMap = fruitStrList.stream()
 .filter(StringUtils::isNotEmpty)
 
 .flatMap(row -> Arrays.stream(row.split(",")))
 
 .collect(Collectors.toMap(
 entry -> entry.split(":")[0],
 entry -> Integer.parseInt(entry.split(":")[1]),
 Integer::sum)
 );
 
 |