(Collectors.groupingBy 复杂用法
时间: 2024-06-08 19:03:52 浏览: 16
`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)));
```
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)