用 Collectors.groupingBy 按班级分组学生
Java 8 的 Stream + Collectors.groupingBy 是最常用、最直观的分组方式。前提是学生对象有明确的分组字段(如 className),且不关心分组后顺序或去重逻辑。
常见错误是直接对 List 调用 stream().collect(...) 却忽略 Student 类没重写 equals/hashCode ——这不会影响分组本身,但后续若对分组后的 List 做去重或查找,就会出问题。
- 分组键必须是不可变对象,推荐用
String(如班级名)或枚举;避免用含可变字段的自定义对象作 key - 默认返回
Map>,若要改为Set存储每组学生,改用Collectors.groupingBy(s -> s.getClassName(), Collectors.toSet()) - 如果班级字段可能为
null,需提前过滤或用Collectors.groupingBy(s -> Optional.ofNullable(s.getClassName()).orElse("未知"))
Map<String, List> classGroups = students.stream()
.collect(Collectors.groupingBy(Student::getClassName));
按成绩区间分组:用 Function 动态计算分组键
当分组逻辑不是简单取字段,而是需要计算(比如“60以下为不及格,60–79为中等,80以上为优秀”),就不能直接传方法引用,得写一个 Function。
容易踩的坑是把判断逻辑写在 groupingBy 外面做预处理——这样会多遍历一次数据,性能差;正确做法是把逻辑内联进 lambda。
立即学习“Java免费学习笔记(深入)”;