(Collectors.groupingBy 复杂用法
时间: 2024-06-08 15:03:52 浏览: 208
Java8 stream 中利用 groupingBy 进行多字段分组求和案例
5星 · 资源好评率100%
`Collectors.groupingBy` 是Java Stream API中的一个实用方法,用于将数据流按照指定键值进行分组。它允许你根据元素的某个属性创建一个键值对的映射,其中键是该属性的值,值则是对应键的所有元素。这个方法在处理大量数据和复杂分组需求时非常有用。
复杂用法通常涉及以下几点:
1. **键选择器**:使用`Function`或`Supplier`作为键选择器,它可以是一个方法引用、lambda表达式或自定义函数,确定如何从每个元素中提取用于分组的键。
```java
List<Person> people = ...;
Map<String, List<Person>> ageGroups = people.stream()
.collect(Collectors.groupingBy(Person::getAge));
```
2. **值收集器**:可以选择不同的收集器(如`Collectors.toList()`、`Collectors.toSet()`等)来处理分组后的值列表。这可以定制化每个组的行为。
```java
Map<String, Integer> counts = people.stream()
.collect(Collectors.groupingBy(Person::getGender, Collectors.counting()));
```
3. **复合条件**:可以结合其他流操作,比如`filter()`和`distinct()`,在分组之前进行筛选和去重。
```java
Map<String, List<String>> countriesWithUniqueNames = names.stream()
.filter(Objects::nonNull)
.collect(Collectors.groupingBy(Function.identity(), Collectors.distinct()));
```
4. **嵌套分组**:如果需要基于多个属性进行分组,可以使用`Collectors.groupingBy`两次。
```java
Map<String, Map<String, List<Person>>> groupedByCityAndAge = people.stream()
.collect(Collectors.groupingBy(Person::getCity, Collectors.groupingBy(Person::getAge)));
```
阅读全文