有个需求是合并两个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);
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(","))) .collect(Collectors.toMap( entry -> entry.split(":")[0], entry -> Integer.parseInt(entry.split(":")[1]), Integer::sum) );
|