将多个list,使用stream流合并,对重复key的value求和
时间: 2023-11-27 11:04:29 浏览: 119
可以使用Java 8的Stream API来完成这个任务。具体做法是:
1. 将多个list合并成一个list,并把每个元素转换成Map.Entry对象,其中key为列表中的元素,value为1。
2. 使用Collectors.groupingBy()方法对这些Map.Entry对象进行分组,以key为分组依据,得到一个Map<K, List<Map.Entry<K, Integer>>>对象。
3. 使用Collectors.toMap()方法将每个key对应的value列表中的value值求和,得到一个Map<K, Integer>对象。
下面是示例代码:
```
List<String> list1 = Arrays.asList("a", "b", "c", "d", "a");
List<String> list2 = Arrays.asList("b", "c", "c", "d", "e");
Map<String, Integer> result = Stream
// 将两个列表合并成一个列表
.concat(list1.stream(), list2.stream())
// 将每个元素转换成Map.Entry对象
.map(e -> new AbstractMap.SimpleEntry<>(e, 1))
// 对Map.Entry对象进行分组
.collect(Collectors.groupingBy(Map.Entry::getKey))
// 对每个key对应的value列表中的value值求和
.entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey,
e -> e.getValue().stream().mapToInt(Map.Entry::getValue).sum()));
System.out.println(result); // 输出:{a=2, b=2, c=3, d=2, e=1}
```
在上面的代码中,我们使用了Stream.concat()方法将两个列表合并成一个列表,并使用了AbstractMap.SimpleEntry类来创建Map.Entry对象。最后得到的结果是一个Map<String, Integer>对象,其中key为列表中的元素,value为该元素在所有列表中出现的次数之和。
阅读全文