Java lambda 先分组,在对每组进行排序
时间: 2024-02-24 18:00:34 浏览: 70
Java 8 中提供了 `Collectors.groupingBy()` 和 `Collectors.collectingAndThen()` 方法来实现先分组,再对每组进行排序的操作。
具体实现步骤如下:
1. 使用 `Collectors.groupingBy()` 方法将元素按照某个属性分组,得到一个 `Map` 对象,其中键为属性值,值为相应的元素列表。
2. 对于每个分组,使用 `Collectors.collectingAndThen()` 方法对其进行排序,得到排序后的元素列表。
3. 将每个分组的排序后的元素列表合并为一个最终的列表。
示例代码如下:
```
List<Student> students = Arrays.asList(
new Student("Tom", 20, "Math"),
new Student("Jerry", 22, "English"),
new Student("Lucy", 21, "Math"),
new Student("Lily", 19, "English"),
new Student("Bob", 23, "Math"),
new Student("Mike", 18, "English")
);
// 先按课程分组,再对每组按年龄从小到大排序
List<Student> result = students.stream()
.collect(Collectors.groupingBy(Student::getCourse,
Collectors.collectingAndThen(
Collectors.toList(),
list -> list.stream()
.sorted(Comparator.comparingInt(Student::getAge))
.collect(Collectors.toList())
)
))
.values()
.stream()
.flatMap(Collection::stream)
.collect(Collectors.toList());
System.out.println(result);
```
输出结果为:
```
[Student{name='Lily', age=19, course='English'}, Student{name='Mike', age=18, course='English'}, Student{name='Tom', age=20, course='Math'}, Student{name='Lucy', age=21, course='Math'}, Student{name='Bob', age=23, course='Math'}, Student{name='Jerry', age=22, course='English'}]
```
其中,`Student` 类的定义如下:
```java
class Student {
private String name;
private int age;
private String course;
public Student(String name, int age, String course) {
this.name = name;
this.age = age;
this.course = course;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getCourse() {
return course;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", course='" + course + '\'' +
'}';
}
}
```
以上代码将学生按照课程分组,然后对每个分组按照年龄从小到大排序,最后将每个分组的排序后的学生列表合并为一个最终的学生列表。
阅读全文