stream流分组后每个组内排序
时间: 2025-02-24 12:38:33 浏览: 31
Java Stream API 分组后每个组内排序
为了实现对 Stream
流进行分组后再对每个组内的元素进行排序,可以利用 Collectors.groupingBy
和 Collectors.mapping
或者嵌套的 Collectors.collectingAndThen
来完成这一需求。下面是一个具体的例子,展示如何基于某个条件分组,并在每组内部按照特定规则排序。
假设有一个学生列表,其中包含学生的年级和成绩信息,目标是对这些记录按年级分组,并在同一级的学生中依据他们的分数降序排列:
import java.util.*;
import java.util.stream.Collectors;
class Student {
private String grade;
private int score;
public Student(String grade, int score) {
this.grade = grade;
this.score = score;
}
// Getters and toString method omitted for brevity
@Override
public String toString() {
return "Student{" +
"grade='" + grade + '\'' +
", score=" + score +
'}';
}
}
public class GroupSortExample {
public static void main(String[] args) {
List<Student> students = Arrays.asList(
new Student("A", 89),
new Student("B", 76),
new Student("A", 92),
new Student("C", 85),
new Student("B", 80)
);
Map<String, List<Student>> groupedSortedStudents =
students.stream()
.collect(Collectors.groupingBy(Student::getGrade,
Collectors.collectingAndThen(
Collectors.toList(),
lst -> lst.stream().sorted((s1, s2) ->
Integer.compare(s2.getScore(), s1.getScore())).toList())));
System.out.println(groupedSortedStudents);
}
}
上述代码片段展示了如何使用 groupingBy
结合自定义比较器来达到目的[^3]。这里的关键在于 Collectors.collectingAndThen
的应用——它允许先执行一次收集操作(这里是转成列表),然后再对该结果施加另一个函数(即再次转化为流并排序)。最终得到的是一个映射表,键为不同的班级名称,而对应的值则是已经过排序的学生对象列表。
相关推荐


















