Collectors.groupingBy() 是 Java 8 Stream API 提供的基础分组方法,通过分类函数将元素归入 Map,键为分类结果、值为对应元素 List;需防范 null 分类函数或 null 键导致的 NullPointerException,支持自定义 Map 类型与下游收集器实现计数、求平均等聚合,并应预处理空值以保障健壮性。
用 Collectors.groupingBy() 实现基础分组
Java 8 引入的 Stream API 提供了最直接的分组方式:Collectors.groupingBy()。它接受一个分类函数(Function),将集合元素按返回值归类到 Map 中,键是分类结果,值是对应元素的 List。
常见错误是传入 null 分类函数,或分类函数返回 null 导致 NullPointerException;另外,默认分组会保留插入顺序(底层用 LinkedHashMap),但若需自定义 Map 类型(如 TreeMap),必须显式指定下游收集器。
- 对
List按age分组:list.stream().collect(Collectors.groupingBy(p -> p.getAge())) - 按字符串长度分组:
words.stream().collect(Collectors.groupingBy(String::length)) - 指定结果为
TreeMap:groupingBy(keyFunc, TreeMap::new, toList())
分组后聚合:不只是分到 List
默认的 groupingBy() 把同组元素收进 List,但实际中常需要统计数量、求和、取平均值等——这时要用「下游收集器」(downstream collector)。
容易忽略的是:下游收集器的类型决定了最终 Map 的值类型。比如用 counting(),值就是 Long;用 summingInt(),值就是 Integer。一旦类型不匹配(如误用 summingDouble() 但字段是 int),编译会报错。
立即学习“Java免费学习笔记(深入)”;