Java中Collectors.groupingBy实现单字段分组,核心是传入提取分组键的Function(如Person::getAge),支持任意类型键(String、Integer等),需处理null(用Objects.toString兜底),默认HashMap无序,可指定LinkedHashMap或TreeMap保证顺序,自定义键须重写equals和hashCode。

Java中Collectors.groupingBy实现单字段分组,核心是传入一个提取分组键的函数(Function),比如用方法引用或Lambda获取对象的某个属性值。
使用对象字段作为分组键
假设有一个Person类,按age字段分组:
List<Person> people = Arrays.asList(
new Person("Alice", 25),
new Person("Bob", 30),
new Person("Charlie", 25)
);
Map<Integer, List<Person>> grouped = people.stream()
.collect(Collectors.groupingBy(Person::getAge));
结果:{25=[Alice, Charlie], 30=[Bob]}
支持基本类型和字符串字段
分组键可以是任意类型——String、Integer、Boolean、LocalDate等。例如按姓名首字母分组:
立即学习“Java免费学习笔记(深入)”;
Collectors.groupingBy(p -> String.valueOf(p.getName().charAt(0)))- 按是否成年:
Collectors.groupingBy(p -> p.getAge() >= 18)
处理空值与自定义Map类型
若字段可能为null,需避免NullPointerException:
- 用
Objects.toString()兜底:Collectors.groupingBy(p -> Objects.toString(p.getDepartment(), "unknown")) - 指定返回
TreeMap(自然排序):Collectors.groupingBy(Person::getAge, TreeMap::new, Collectors.toList())
常见误区提醒
注意groupingBy默认使用HashMap,不保证顺序;如需有序结果,应显式传入LinkedHashMap::new或TreeMap::new。另外,分组键必须重写equals和hashCode(对自定义对象而言),否则可能导致分组异常。


















