news 2026/4/18 1:19:16

Java8 groupingBy从入门到精通:图解+示例

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Java8 groupingBy从入门到精通:图解+示例

快速体验

  1. 打开 InsCode(快马)平台 https://www.inscode.net
  2. 输入框内输入如下内容:
创建一个Java学习示例程序,逐步演示Collectors.groupingBy的使用:1) 基础单字段分组;2) 多级分组(先按省份再按城市);3) 分组后聚合计算(求平均值、求和等);4) 自定义分组逻辑。每个示例都要有对应的输入数据样例和详细的控制台输出,并添加通俗易懂的注释说明。
  1. 点击'项目生成'按钮,等待项目生成完整后预览效果

今天在整理Java8的Stream API笔记时,发现Collectors.groupingBy这个收集器特别实用,但刚开始接触时总容易混淆它的几种用法。通过几个实际案例的反复练习,终于理清了它的核心逻辑,这里把学习过程记录下来,希望能帮到同样在入门阶段的同学。

1. 理解groupingBy的基础概念

groupingBy是Java8中Collectors工具类提供的一个分组收集器,它能够按照指定的条件将流中的元素分组,最终返回一个Map结构。想象一下Excel里的数据透视表功能,groupingBy就是代码版的"分类汇总"工具。

它的核心优势在于: - 避免了传统for循环中繁琐的if-else分组逻辑 - 配合Stream API可以实现声明式编程 - 支持多级分组和复杂聚合操作

2. 单字段分组实战

我们先从最简单的场景开始:假设有一批学生数据,需要按照班级进行分组。数据准备如下:

List<Student> students = Arrays.asList( new Student("张三", "一班", 85), new Student("李四", "二班", 92), new Student("王五", "一班", 78) );

使用groupingBy实现单字段分组:

Map<String, List<Student>> byClass = students.stream() .collect(Collectors.groupingBy(Student::getClassName));

输出结果会是:

{ "一班": [Student("张三"), Student("王五")], "二班": [Student("李四")] }

3. 多级分组技巧

实际业务中经常需要多维度分组。比如先按省份再按城市分组:

List<Person> people = Arrays.asList( new Person("张三", "浙江", "杭州"), new Person("李四", "浙江", "宁波"), new Person("王五", "江苏", "南京") ); Map<String, Map<String, List<Person>>> result = people.stream() .collect(Collectors.groupingBy( Person::getProvince, Collectors.groupingBy(Person::getCity) ));

输出结构会是嵌套Map:

{ "浙江": { "杭州": [Person("张三")], "宁波": [Person("李四")] }, "江苏": { "南京": [Person("王五")] } }

4. 分组后聚合计算

分组后我们经常需要统计信息,比如计算每个班级的平均分:

Map<String, Double> avgScoreByClass = students.stream() .collect(Collectors.groupingBy( Student::getClassName, Collectors.averagingDouble(Student::getScore) ));

输出示例:

{ "一班": 81.5, "二班": 92.0 }

类似的聚合操作还有: -counting()计数 -summingInt()求和 -maxBy()求最大值 -minBy()求最小值

5. 自定义分组逻辑

有时候标准的分组条件不够用,我们可以自定义分组器。例如按分数段分组:

Map<String, List<Student>> byScoreRange = students.stream() .collect(Collectors.groupingBy( student -> { if (student.getScore() >= 90) return "优秀"; else if (student.getScore() >= 80) return "良好"; else return "及格"; } ));

6. 实际应用中的注意事项

经过多次实践,总结了几个容易踩坑的地方:

  1. 空值处理:分组字段为null时会抛出NPE,建议提前过滤或使用Objects.requireNonNullElse
  2. 性能考虑:大数据量时,多级分组可能产生大量小对象
  3. 结果不可变:返回的Map和List都是不可变的,修改会抛异常
  4. 并行流使用:确保分组操作是线程安全的

7. 典型应用场景

在工作中发现这些场景特别适合用groupingBy: - 报表数据统计(按部门/时间维度汇总) - 电商商品按类目分组展示 - 日志分析时按错误类型分类 - 用户分群运营

最近在InsCode(快马)平台上实践这些例子时,发现它的Java环境配置特别方便,不需要本地安装JDK就能直接运行代码片段。对于想快速验证Stream API效果的同学,这种即开即用的体验真的很省心。特别是写分组聚合这类复杂操作时,可以实时看到中间结果,比在本地IDE调试要高效很多。

如果要把这些示例做成可交互的教学demo,平台的一键部署功能就能派上用场。比如把分组结果用可视化图表展示,部署后其他人打开链接就能直接操作,比截图和文字描述直观多了。对于Java8新特性的教学演示,这种即时反馈的方式学习效果特别好。

快速体验

  1. 打开 InsCode(快马)平台 https://www.inscode.net
  2. 输入框内输入如下内容:
创建一个Java学习示例程序,逐步演示Collectors.groupingBy的使用:1) 基础单字段分组;2) 多级分组(先按省份再按城市);3) 分组后聚合计算(求平均值、求和等);4) 自定义分组逻辑。每个示例都要有对应的输入数据样例和详细的控制台输出,并添加通俗易懂的注释说明。
  1. 点击'项目生成'按钮,等待项目生成完整后预览效果
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 22:47:47

【Java毕设全套源码+文档】基于springboot的健康健身追踪系统设计与实现(丰富项目+远程调试+讲解+定制)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/4/16 10:11:14

基于Vector工具链的UDS 28服务测试方案

如何用Vector工具链精准测试UDS 28服务&#xff1f;实战全解析 你有没有遇到过这样的场景&#xff1a;在刷写ECU程序时&#xff0c;总线突然拥塞&#xff0c;诊断中断&#xff1b;或者想安静地读取DTC&#xff0c;却被一堆周期性报文干扰得无法响应&#xff1f;这时候&#xff…

作者头像 李华
网站建设 2026/4/17 20:15:12

环境隔离大师:每个项目独立镜像,再不怕依赖冲突

环境隔离大师&#xff1a;每个项目独立镜像&#xff0c;再不怕依赖冲突 1. 为什么需要环境隔离&#xff1f; 作为一名接外包的开发者&#xff0c;你是否经常遇到这样的困扰&#xff1a;同时维护5个项目时&#xff0c;conda环境乱到连自己都理不清&#xff1f;Python版本冲突、…

作者头像 李华
网站建设 2026/4/17 21:46:09

GRAPH TD vs 传统绘图工具:效率提升300%的秘诀

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 构建一个GRAPH TD与传统流程图工具的对比演示应用&#xff0c;展示同样的流程图在GRAPH TD和Visio中的创建过程。要求记录并可视化两种方式的时间消耗、修改便捷度和协作效率&…

作者头像 李华
网站建设 2026/4/16 23:32:00

告别手动调整!AI智能文档扫描仪一键拉直歪斜文档

告别手动调整&#xff01;AI智能文档扫描仪一键拉直歪斜文档 1. 引言&#xff1a;办公场景中的文档处理痛点 在日常办公、学习或报销流程中&#xff0c;我们经常需要将纸质文档、发票、白板笔记等转换为电子版。传统方式依赖手机拍照后手动裁剪、旋转、调色&#xff0c;不仅效…

作者头像 李华
网站建设 2026/4/17 15:21:10

AnimeGANv2如何监控性能?CPU/内存使用率观测实战

AnimeGANv2如何监控性能&#xff1f;CPU/内存使用率观测实战 1. 背景与应用场景 随着轻量级AI模型在边缘设备和消费级硬件上的广泛应用&#xff0c;模型推理的资源消耗监控成为工程落地中的关键环节。AnimeGANv2作为一款专为照片转二次元动漫设计的轻量级风格迁移模型&#x…

作者头像 李华