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 9:42:11

ArrayBlockingQueue 源码阅读

ArrayBlockingQueue 源码阅读 ArrayBlockingQueue 简介 阻塞队列就是典型的生产者-消费者模型&#xff0c;它可以做到以下几点: 当阻塞队列数据为空时&#xff0c;所有的消费者线程都会被阻塞&#xff0c;等待队列非空。当生产者往队列里填充数据后&#xff0c;队列就会通知消费…

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

5分钟快速部署通义千问2.5-7B-Instruct,Docker+vLLM推理加速实战

5分钟快速部署通义千问2.5-7B-Instruct&#xff0c;DockervLLM推理加速实战 1. 引言 随着大语言模型在自然语言理解、代码生成和多语言支持等方面的持续进化&#xff0c;Qwen2.5系列的发布标志着中等规模模型在性能与实用性之间的进一步平衡。其中&#xff0c;通义千问2.5-7B…

作者头像 李华
网站建设 2026/4/17 1:08:40

黄山尖的四季景致,解锁水秀岛奇的湖光山色

黄山尖是杭州千岛湖东南湖区珍珠列岛内海拔最高的岛屿&#xff0c;主峰海拔266米。它以其开阔的视野、独特的岛屿布局&#xff0c;以及“水秀、岛奇、景幽”的景观特色&#xff0c;成为俯瞰千岛湖风光的一个代表性观景点。 前往黄山尖&#xff0c;通常需要从东南湖区码头乘坐游…

作者头像 李华
网站建设 2026/4/18 0:10:24

【Java毕设源码分享】基于springboot+Web的出租车拼车系统的设计与实现(程序+文档+代码讲解+一条龙定制)

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

作者头像 李华
网站建设 2026/4/18 5:14:04

VibeVoice-TTS支持4说话人?真实场景测试部署教程

VibeVoice-TTS支持4说话人&#xff1f;真实场景测试部署教程 1. 引言&#xff1a;从播客生成到多说话人TTS的演进 随着AIGC技术的发展&#xff0c;文本转语音&#xff08;TTS&#xff09;已不再局限于单人朗读式输出。越来越多的内容创作者开始探索长篇对话式音频内容的自动化…

作者头像 李华
网站建设 2026/4/18 5:14:05

AnimeGANv2能否集成支付?增值服务商业化路径

AnimeGANv2能否集成支付&#xff1f;增值服务商业化路径 1. 引言&#xff1a;AI二次元转换器的商业潜力 随着生成式AI技术的快速发展&#xff0c;风格迁移模型在消费级应用中展现出巨大潜力。AnimeGANv2作为轻量高效的人像动漫化模型&#xff0c;凭借其小体积、高质量和快速推…

作者头像 李华