java stream api的groupingby是最常用分类聚合工具,可按条件分组返回map,默认值为list;支持指定下游收集器(如counting、summingint)、多级分组、空值处理及自定义map类型。

Java Stream API 的 groupingBy 是最常用也最实用的分类聚合工具,它能把集合按某个条件“分组”,返回一个 Map,键是分组依据,值是该组内所有元素组成的列表(默认)。
基础用法:按字段简单分组
比如有一组员工数据,想按部门归类:
List<employee> employees = Arrays.asList(
new Employee("张三", "研发部"),
new Employee("李四", "销售部"),
new Employee("王五", "研发部")
);</employee>
只需一行就能得到 Map<string list>></string>:
Map<string list>> byDept = employees.stream()
.collect(Collectors.groupingBy(Employee::getDepartment));</string>
结果中键是部门名(如 "研发部"),值是对应员工列表。
指定下游收集器:不只是List
默认返回 List,但你可以换成其他容器或聚合结果:
- 用
Collectors.counting()统计每组数量 - 用
Collectors.summingInt(e -> e.getSalary())求和 - 用
Collectors.mapping(..., Collectors.toList())提取字段再收集 - 用
Collectors.toSet()去重后存为 Set
例如统计各部门人数:
Map<string long> deptCount = employees.stream()
.collect(Collectors.groupingBy(Employee::getDepartment, Collectors.counting()));</string>
多级分组:嵌套 groupingBy
支持链式调用实现“先按部门,再按职级”这类两层结构:
Map<string map list>>> nested = employees.stream()
.collect(Collectors.groupingBy(
Employee::getDepartment,
Collectors.groupingBy(Employee::getLevel)
));</string>
外层 Map 的键是部门,值是另一个 Map;内层 Map 键是职级(如 "高级工程师"),值是该职级员工列表。
处理空值与自定义Map类型
如果分组键可能为 null,groupingBy 默认会抛异常。可传入 HashMap::new 或 TreeMap::new 指定 Map 实现,并配合 Collectors.collectingAndThen 等做空值适配:
- 用
Collectors.groupingBy(e -> e.getDepartment() == null ? "未知" : e.getDepartment())预处理空键 - 用
Collectors.groupingBy(..., LinkedHashMap::new, ...)保持插入顺序 - 用
Collectors.groupingByConcurrent()在并行流中生成线程安全的ConcurrentMap
不复杂但容易忽略细节。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











