`Collectors.groupingBy()`还有哪些可选的归约规则?
时间: 2024-12-13 11:19:03 浏览: 9
`Collectors.groupingBy()`方法除了默认的行为(将元素映射到键上并收集到值列表中),还支持多种归约规则(reduction rules)。例如:
1. **ToSet**: 将每个键对应的值集合转化为Set,消除重复。
```java
Map<String, Set<T>> map = values.stream()
.collect(Collectors.toMap(Function.identity(), Function.identity(), (u, v) -> u, Collectors.toSet()));
```
2. **ToMap**: 提供一个合并函数(如Merger)来合并同键的值,可以定制合并策略。
```java
Map<String, MyObject> map = values.stream()
.collect(Collectors.toMap(Function.identity(), MyObject::new, MyObjectMerger::merge));
```
3. **ToBiMap**: 如果需要保持键的唯一性,而值可以有多个,可以使用`Collectors.toBiMap()`得到一个双向映射(Bimap)。
4. **Counting**: 统计每个键的数量。
```java
Map<String, Long> countMap = values.stream()
.collect(Collectors.groupingBy(identity(), Collectors.counting()));
```
5. **Reducing**: 可以提供一个Reducer来对每个键的所有值进行累积操作。
```java
long total = values.stream()
.collect(Collectors.groupingBy(MyClass::getKey, Collectors.reducing(0L, MyClass::getValue)));
```
每种归约规则都提供了不同的功能,用于满足不同的聚合需求。
阅读全文