stream分组【排序】
时间: 2025-01-02 14:25:48 浏览: 23
Java Stream API 分组后排序
当涉及到分组和排序的操作时,Collectors.groupingBy
和 Collectors.collectingAndThen
方法能够很好地完成这些需求。对于先分组再排序的情况,通常会创建一个映射(Map),其中键是用于分组的标准,而值则是对应的列表或进一步处理的结果。
考虑有一个学生类 Student
的例子来展示如何实现这一点:
import java.util.*;
import java.util.stream.Collectors;
class Student {
private String name;
private int gradeLevel;
// Constructor, getters and setters
@Override
public String toString() {
return "Student{name='" + this.name + "', gradeLevel=" + this.gradeLevel + "}";
}
}
现在假设有一系列的学生对象,并希望按照年级对学生进行分组并按名字对每一年级内的学生进行排序:
List<Student> students = Arrays.asList(
new Student("Alice", 1),
new Student("Bob", 2),
new Student("Charlie", 1),
new Student("David", 3));
Map<Integer, List<Student>> groupedStudentsByNameSorted = students.stream()
.collect(Collectors.groupingBy(Student::getGradeLevel,
Collectors.collectingAndThen(
Collectors.toList(),
list -> list.stream().sorted(Comparator.comparing(Student::getName)).collect(Collectors.toList())
)
));
groupedStudentsByNameSorted.forEach((grade, studentList) ->
System.out.printf("Grade %d: %s\n", grade, studentList.toString()));
这段代码首先根据学生的年级(gradeLevel
)进行了分组;其次,在每个年级内部利用自定义比较器实现了基于姓名(name
)升序排列的功能[^2]。
相关推荐


















