java8特性:Collectors.groupingBy进行分组、排序等操作
时间: 2023-10-13 12:15:56 浏览: 102
Java8 stream 中利用 groupingBy 进行多字段分组求和案例
5星 · 资源好评率100%
在Java8中,我们可以使用Stream API来对集合进行分组、排序等操作,其中Collectors.groupingBy是一个非常有用的方法。它接收一个Function作为参数,用于将元素映射为分组的键,返回一个Map类型的结果,其中键是由Function映射的结果,值是对应的元素列表。
例如,我们有一个Person类,其中包含姓名和年龄两个属性,我们想按照年龄进行分组:
```
List<Person> persons = Arrays.asList(
new Person("John", 30),
new Person("Jane", 25),
new Person("Bob", 40),
new Person("Mary", 35)
);
Map<Integer, List<Person>> personsByAge = persons.stream()
.collect(Collectors.groupingBy(Person::getAge));
personsByAge.forEach((age, list) -> System.out.println(age + " -> " + list));
```
输出结果为:
```
25 -> [Person{name='Jane', age=25}]
30 -> [Person{name='John', age=30}]
35 -> [Person{name='Mary', age=35}]
40 -> [Person{name='Bob', age=40}]
```
我们还可以对分组结果进行排序,例如按照年龄从小到大排序:
```
Map<Integer, List<Person>> personsByAgeSorted = persons.stream()
.collect(Collectors.groupingBy(Person::getAge, TreeMap::new, Collectors.toList()));
personsByAgeSorted.forEach((age, list) -> System.out.println(age + " -> " + list));
```
输出结果为:
```
25 -> [Person{name='Jane', age=25}]
30 -> [Person{name='John', age=30}]
35 -> [Person{name='Mary', age=35}]
40 -> [Person{name='Bob', age=40}]
```
在这个例子中,我们使用TreeMap作为分组结果的容器,实现了按照年龄从小到大排序的功能。
阅读全文