0%

java8合并map

有个需求是合并两个map,并对相同key的元素的value进行求和。

1
2
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。

1
2
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);

// method1
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 类似这样的数据。要统计每类水果的数量。

1
2
3
4
5
6
7
8
9
10
11
Map<String, Integer> fruitCountMap = fruitStrList.stream()
// 过滤掉空字符串
.filter(StringUtils::isNotEmpty)
// 按逗号拆分,并压平
.flatMap(row -> Arrays.stream(row.split(",")))
// 生成map,相同的Key,累加value
.collect(Collectors.toMap(
entry -> entry.split(":")[0],
entry -> Integer.parseInt(entry.split(":")[1]),
Integer::sum)
);