news 2026/2/28 5:43:44

318. Java Stream API - 深入理解 Java Stream 的中间 Collector —— mapping、filtering 和 flatMapping

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
318. Java Stream API - 深入理解 Java Stream 的中间 Collector —— mapping、filtering 和 flatMapping

文章目录

  • 318. Java Stream API - 深入理解 Java Stream 的中间 Collector —— `mapping`、`filtering` 和 `flatMapping`
    • 🧭 为什么需要中间 Collector?
    • 🧪 示例 1:使用 `mapping()` 做数据转换
      • 🧾 输出:
    • 🧪 示例 2:结合 `groupingBy()` 和 `mapping()` 解决复杂 Map 转换问题
      • 🔍 输出示例:
    • 🏆 提取最大值对应的 key(次数最多的字符串长度)
    • 🧪 示例 3:使用 `filtering()` 收集特定条件的值
    • 🧪 示例 4:使用 `flatMapping()` 将嵌套集合打平
    • 🎯 总结与培训小贴士

318. Java Stream API - 深入理解 Java Stream 的中间 Collector ——mappingfilteringflatMapping

在使用Streamcollect()方法时,我们通常接触的Collector终端操作(terminal operations,比如:

  • Collectors.counting():计算数量 ✅
  • Collectors.joining():拼接字符串 ✅
  • Collectors.toList()toSet()toMap():收集到集合 ✅

但除了这些终端操作外,JavaCollectorAPI还提供了一些中间Collector,如:

  • mapping
  • filtering
  • flatMapping

这些 Collector 本身无法单独使用,必须配合一个下游 Collector(downstream collector)。你可以理解为:

🎯 “我们在收集之前,先加工一下再装袋。”


🧭 为什么需要中间 Collector?

有时候,我们不仅想将元素分组或收集,还想在收集之前“处理一下”。比如:

  • 把字符串变成大写再收集
  • 过滤掉不想要的值再分组
  • 将一个对象映射为其某个字段再放进 Map

这时候中间 Collector 就登场了!


🧪 示例 1:使用mapping()做数据转换

假设你有一堆英文单词字符串,想将它们变成大写字母并放进列表中:

Collection<String>strings=List.of("one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve");List<String>result=strings.stream().collect(Collectors.mapping(String::toUpperCase,Collectors.toList()));System.out.println("result = "+result);

🧾 输出:

result=[ONE,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,TEN,ELEVEN,TWELVE]

解释:

  • mapping(String::toUpperCase, ...)是中间 Collector,先把元素变为大写。
  • Collectors.toList()是终端 Collector,把处理结果装进列表。

你可以把这看作是“加工厂 + 装箱厂”的组合 🤖📦。


🧪 示例 2:结合groupingBy()mapping()解决复杂 Map 转换问题

假设你要统计不同长度的单词出现次数(即直方图),然后你想倒转这个 Map,以“次数”为 key,得到这些次数对应的“长度”。

第一步:创建直方图Map<Integer, Long>

Map<Integer,Long>histogram=strings.stream().collect(Collectors.groupingBy(String::length,Collectors.counting()));

第二步:使用record将 Map entry 封装成对象,方便处理:

recordNumberOfLength(intlength,longnumber){staticNumberOfLengthfromEntry(Map.Entry<Integer,Long>entry){returnnewNumberOfLength(entry.getKey(),entry.getValue());}}

第三步:倒转 Map,以“次数”为 key,用mapping()提取length字段:

varmap=histogram.entrySet().stream().map(NumberOfLength::fromEntry).collect(Collectors.groupingBy(NumberOfLength::number,// 按出现次数分组Collectors.mapping(NumberOfLength::length,Collectors.toList())// 提取 length 放进 List));map.forEach((key,value)->System.out.println(key+" :: "+value));

🔍 输出示例:

2::[6]3::[3,4,5]

这表示:长度为 3、4、5 的单词各出现了 3 次;长度为 6 的出现了 2 次。


🏆 提取最大值对应的 key(次数最多的字符串长度)

Map.Entry<Long,List<Integer>>result=map.entrySet().stream().max(Map.Entry.comparingByKey())// 找到次数最多的 group.orElseThrow();System.out.println("result = "+result);

输出:

result=3=[3,4,5]

你就得到了出现次数最多的字符串长度(3 次):长度为 3、4、5 的单词。


🧪 示例 3:使用filtering()收集特定条件的值

  • java9+可用
Map<Integer,List<String>>filteredGrouped=strings.stream().collect(Collectors.groupingBy(String::length,Collectors.filtering(s->s.contains("e"),Collectors.toList())));System.out.println(filteredGrouped);

📌 解释:

  • filtering()是一个中间 Collector,只收集包含字母'e'的单词。
  • 最终结果还是一个分组,但每组只留下符合条件的值。

🧪 示例 4:使用flatMapping()将嵌套集合打平

  • java9+可用

如果你有一个List<List<String>>,想打平成一个大列表,可以这样:

List<List<String>>nested=List.of(List.of("a","b"),List.of("c"),List.of("d","e","f"));List<String>flat=nested.stream().collect(Collectors.flatMapping(List::stream,Collectors.toList()));System.out.println(flat);

📌 输出:

[a,b,c,d,e,f]

🎯 总结与培训小贴士

Collector 类型描述使用场景
mapping()将元素映射后再收集提取字段、格式转换
filtering()筛选符合条件的元素再收集条件收集
flatMapping()扁平化流结构后收集嵌套集合、多个子项的合并

✅ 这些中间 Collector 是创建嵌套结构和处理 Map 数据的强大工具。
✅ 多层嵌套也没什么可怕的,本质是“先加工后装袋”的组合模型。
groupingBy()搭配中间 Collector 是流处理中最常见也最强大的用法之一。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/19 13:19:09

智能控制雨刷设计

智能控制雨刷设计与实现 第一章 设计背景与核心目标 传统汽车雨刷多采用固定档位手动调节&#xff0c;存在刮刷频率与实际雨量不匹配、雨天视线改善不及时、频繁手动操作分散驾驶注意力等问题&#xff0c;影响驾驶安全性与舒适性。智能控制雨刷依托传感检测、自动控制与汽车电…

作者头像 李华
网站建设 2026/2/22 6:54:40

智能交流稳态电源控制器

智能交流稳态电源控制器设计 第一章 设计背景与核心目标 在工业自动化、精密测试设备、通信电源及实验室供电系统中&#xff0c;交流供电质量直接影响设备运行稳定性与测量精度。传统交流稳压装置多采用机械调压或简单晶闸管调压方式&#xff0c;存在响应速度慢、稳压精度低、波…

作者头像 李华
网站建设 2026/2/19 0:16:05

西门子200smart运动控制四轴搬运取料机(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

西门子200smart运动控制四轴搬运取料机(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码该程序为两台smart plc通过通讯控制四轴伺服电机的搬运取料机案例工程案例程序。 商品包含200smar_PLC程序项目电气接线图程序流程说明触…

作者头像 李华
网站建设 2026/2/19 1:34:51

2026大模型平台漏洞全景报告:攻防新格局下的风险纵深与防御体系

2026年&#xff0c;大语言模型&#xff08;LLM&#xff09;技术正从单一文本交互向自主智能体协同、全模态融合、长期记忆落地的新阶段高速演进&#xff0c;攻击面随技术能力同步拓宽&#xff0c;漏洞类型从传统的提示注入、数据泄露&#xff0c;升级为智能体劫持、多模态隐形注…

作者头像 李华
网站建设 2026/2/26 8:41:23

比MySQL快800倍的数据库:ClickHouse的性能秘密

前言 当传统数据库在处理亿级数据查询时陷入性能瓶颈&#xff0c;一家俄罗斯互联网巨头却默默开发出了一款能比Vertica快5倍、比MySQL快800倍的分析型数据库。 “每天处理超过1000亿条记录&#xff0c;支持近400台服务器集群&#xff0c;历史总记录超过13万亿条。”这是ClickHo…

作者头像 李华