java中collectors.groupingby()按分类函数分组生成map,支持指定map类型、下游聚合(如counting/averagingdouble)及多级分组,还提供groupingbyconcurrent实现线程安全。

Java 中用 Collectors.groupingBy() 对数据分组,核心是传入一个分类函数(即“按什么分”),它会自动把流中元素按该函数返回值归类,生成 Map<k list>></k>。
基础用法:按字段简单分组
比如有一个 Person 类,含 name 和 age 字段,想按年龄分组:
List<person> people = Arrays.asList(
new Person("Alice", 25),
new Person("Bob", 30),
new Person("Charlie", 25)
);
Map<integer list>> grouped = people.stream()
.collect(Collectors.groupingBy(Person::getAge));
// 结果:{25=[Alice, Charlie], 30=[Bob]}
</integer></person>
指定 Map 类型或自定义容器
默认返回 HashMap,但可指定其他实现,比如保持插入顺序的 LinkedHashMap:
- 用
Collectors.groupingBy(classifier, LinkedHashMap::new, downstream) - 常见组合:分组后统计数量、求和、取平均值等,靠第三个参数(下游收集器)实现
分组后聚合:不只是装进 List
第二个参数可以传下游收集器,实现更灵活结果。例如只统计每组人数:
Map<integer long> countByAge = people.stream()
.collect(Collectors.groupingBy(Person::getAge, Collectors.counting()));
// {25=2, 30=1}
</integer>
再比如按年龄分组,并计算平均身高(假设 Person 有 height 字段):
Map<integer double> avgHeightByAge = people.stream()
.collect(Collectors.groupingBy(
Person::getAge,
Collectors.averagingDouble(Person::getHeight)
));
</integer>
多级分组:嵌套 groupingBy
用 groupingBy 套一层,实现“先按 A 分,再按 B 分”:
Map<integer map list>>> groupedByAgeAndNameFirst = people.stream()
.collect(Collectors.groupingBy(
Person::getAge,
Collectors.groupingBy(p -> String.valueOf(p.getName().charAt(0)))
));
// 按年龄分组,每组内再按姓名首字母分
</integer>
也可用 Collectors.groupingByConcurrent() 在并行流中获得线程安全的 ConcurrentMap。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











