Collectors.groupingBy的用法
时间: 2023-10-14 17:29:00 浏览: 71
深入探索Java 8的`Collectors.groupingBy()`:分组的艺术
Collectors.groupingBy是Java 8中的一个收集器(Collector),它的作用是将流中的元素按照指定的条件分组。
它的基本用法如下:
```java
Map<K, List<T>> groupingBy(Function<? super T, ? extends K> classifier)
```
其中,classifier参数是一个Function函数式接口,用于指定分组的条件,返回值是一个Map,其中键是分组的条件,值是分组的元素列表。
例如,假设有一个Person类,其中包含name和age两个属性,现在需要将一组Person对象按照age属性进行分组,可以使用groupingBy方法:
```java
List<Person> people = Arrays.asList(
new Person("Tom", 18),
new Person("Jerry", 19),
new Person("Alice", 18),
new Person("Bob", 20)
);
Map<Integer, List<Person>> groupByAge = people.stream()
.collect(Collectors.groupingBy(Person::getAge));
```
上述代码将会按照age属性进行分组,得到一个Map,其中键是age属性的值,值是该age属性对应的Person对象列表。例如,上述代码执行后得到的结果为:
```java
{
18=[Person(name=Tom, age=18), Person(name=Alice, age=18)],
19=[Person(name=Jerry, age=19)],
20=[Person(name=Bob, age=20)]
}
```
除了按照一个条件进行分组外,groupingBy方法还支持按照多个条件进行分组,例如:
```java
Map<String, Map<Integer, List<Person>>> groupByAgeAndName = people.stream()
.collect(Collectors.groupingBy(Person::getName, Collectors.groupingBy(Person::getAge)));
```
上述代码将会按照name和age两个属性进行分组,得到一个嵌套的Map,其中外层Map的键是name属性的值,值是内层Map,内层Map的键是age属性的值,值是该age属性对应的Person对象列表。例如,上述代码执行后得到的结果为:
```java
{
"Tom"={
18=[Person(name=Tom, age=18)]
},
"Jerry"={
19=[Person(name=Jerry, age=19)]
},
"Alice"={
18=[Person(name=Alice, age=18)]
},
"Bob"={
20=[Person(name=Bob, age=20)]
}
}
```
阅读全文