news 2026/6/16 6:26:33

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/6/13 22:14:10

用AI快速测试魔兽宏创意:10秒验证你的战术想法

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个宏命令沙盒环境&#xff1a;1)输入宏创意描述&#xff08;如被攻击时自动闪现冰箱&#xff09;2)AI即时生成可执行代码 3)3D角色模拟器展示效果 4)参数调整滑块&#xff0…

作者头像 李华
网站建设 2026/6/8 2:27:42

AnimeGANv2能否自定义风格?微调训练部署全流程

AnimeGANv2能否自定义风格&#xff1f;微调训练部署全流程 1. 引言&#xff1a;AI 二次元转换器 - AnimeGANv2 随着深度学习在图像生成领域的持续突破&#xff0c;AnimeGANv2 成为近年来最受欢迎的轻量级照片转动漫模型之一。它基于生成对抗网络&#xff08;GAN&#xff09;架…

作者头像 李华
网站建设 2026/6/8 2:27:27

亲测好用9个AI论文软件,研究生高效写作必备!

亲测好用9个AI论文软件&#xff0c;研究生高效写作必备&#xff01; AI 工具如何让论文写作更高效&#xff1f; 在研究生阶段&#xff0c;论文写作是一项既耗时又费力的任务。无论是选题、文献综述、数据分析&#xff0c;还是最终的润色和降重&#xff0c;每一步都需要大量的…

作者头像 李华
网站建设 2026/6/13 6:57:38

AnimeGANv2应用实战:打造个性化动漫头像生成器

AnimeGANv2应用实战&#xff1a;打造个性化动漫头像生成器 1. 引言 1.1 业务场景描述 随着社交媒体和虚拟形象的普及&#xff0c;用户对个性化头像的需求日益增长。传统的手绘动漫头像成本高、周期长&#xff0c;难以满足大众用户的即时创作需求。与此同时&#xff0c;AI技术…

作者头像 李华
网站建设 2026/6/15 19:48:30

通义千问2.5效果展示:128K长文本处理惊艳案例

通义千问2.5效果展示&#xff1a;128K长文本处理惊艳案例 1. 引言 随着大语言模型在自然语言理解、代码生成和多模态任务中的广泛应用&#xff0c;对长上下文建模能力的需求日益增长。传统模型通常受限于8K或32K的上下文长度&#xff0c;在处理法律合同、技术文档、科研论文等…

作者头像 李华
网站建设 2026/6/13 16:38:39

怎么把电脑数据转移到新电脑?这5个技巧必看!

更换电脑并不是买台新设备那么简单&#xff0c;这个过程往往伴随着数据迁移。然而&#xff0c;不少用户还是不知道怎么把电脑数据转移到新电脑&#xff0c;要么担心选错方法&#xff0c;要么担心步骤复杂不会操作。其实&#xff0c;转移数据真的没你想象的那么难。在这篇文章中…

作者头像 李华