news 2026/4/19 0:49:16

275. Java Stream API - flatMap 操作:展开一对多的关系,拉平你的流!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
275. Java Stream API - flatMap 操作:展开一对多的关系,拉平你的流!

文章目录

  • 275. Java Stream API - flatMap 操作:展开一对多的关系,拉平你的流!
      • 🧠 背景:我们为什么需要 `flatMap`?
    • 🔁 用 `flatMap` 优雅替代嵌套循环
      • ✅ 定义模型结构
      • ✅ 初始化数据
      • 🚀 使用 `flatMap` 重写统计逻辑
    • 🔍 `flatMap` 是如何工作的?
      • 步骤 1️⃣:映射(map)
      • 步骤 2️⃣:展平(flat)
    • 📚 延伸案例:`Map` 结构的 `flatMap`
    • 🧠 小结:`flatMap` 用法口诀
    • 🧪 练习建议(课堂可选)
      • ❓ 问题:下面代码的输出是什么?

275. Java Stream API - flatMap 操作:展开一对多的关系,拉平你的流!


🧠 背景:我们为什么需要flatMap

假设我们有以下结构:

  • 每个Country拥有多个City
  • 每个City有一个人口数population

我们的目标是:统计所有城市的总人口数

最直接的写法当然是嵌套 for 循环

inttotalPopulation=0;for(Countrycountry:countries){for(Citycity:country.cities()){totalPopulation+=city.population();}}System.out.println("Total population = "+totalPopulation);

📌 输出:

Totalpopulation=24493

虽然有效,但Java 8之后我们有了更优雅的方式:使用流 +flatMap来处理一对多的关系


🔁 用flatMap优雅替代嵌套循环

✅ 定义模型结构

recordCity(Stringname,intpopulation){}recordCountry(Stringname,List<City>cities){}

✅ 初始化数据

CitynewYork=newCity("New York",8_258);CitylosAngeles=newCity("Los Angeles",3_821);Countryusa=newCountry("USA",List.of(newYork,losAngeles));Citylondon=newCity("London",8_866);Citymanchester=newCity("Manchester",568);Countryuk=newCountry("United Kingdom",List.of(london,manchester));Cityparis=newCity("Paris",2_103);Citymarseille=newCity("Marseille",877);Countryfrance=newCountry("France",List.of(paris,marseille));List<Country>countries=List.of(usa,uk,france);

🚀 使用flatMap重写统计逻辑

inttotalPopulation=countries.stream().flatMap(country->country.cities().stream())// 展开所有城市.mapToInt(City::population)// 提取人口.sum();// 累加总人口System.out.println("Total population = "+totalPopulation);

📌 输出:

Totalpopulation=24493

🔍flatMap是如何工作的?

flatMap是两个操作的组合:

步骤 1️⃣:映射(map)

country->country.cities().stream()

这一步将每个Country映射为它的城市流,得到的是一个Stream<Stream<City>>(流的流)。


步骤 2️⃣:展平(flat)

flatMap自动帮你把多个子流合并为一个连续的扁平流Stream<City>),这样你就可以对所有城市统一处理!

🎯 类比图示:

Stream<Country>---映射--->Stream<Stream<City>>|+--->展平(flatten)--->Stream<City>

📚 延伸案例:Map结构的flatMap

假设我们有一个Continent类型,它包含一个 Map:

recordContinent(Map<String,Country>countries){}

此时,如果你想从Continent中提取所有国家,可以这样写:

Function<Continent,Stream<Country>>continentToCountry=continent->continent.countries().values().stream();

再进一步,还可以这样嵌套flatMap

inttotal=continents.stream().flatMap(continent->continent.countries().values().stream()).flatMap(country->country.cities().stream()).mapToInt(City::population).sum();

🧠 小结:flatMap用法口诀

用法场景对应方法
一对一映射(每个元素 → 单个新值).map()
一对多映射(每个元素 → 多个新值).flatMap()
提取嵌套集合中的内容并扁平化.flatMap()
转换成基础类型流(int/long/double.mapToInt()

🧪 练习建议(课堂可选)

❓ 问题:下面代码的输出是什么?

List<String>words=List.of("java","stream","api");List<Character>chars=words.stream().flatMap(word->word.chars().mapToObj(c->(char)c)).toList();System.out.println(chars);

🎯 答案:

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

Excalidraw版本更新日志解读:新功能抢先体验

Excalidraw版本更新日志解读&#xff1a;新功能抢先体验 在远程协作成为常态的今天&#xff0c;一个能快速捕捉灵感、支持多人实时共创的可视化工具&#xff0c;几乎成了每个技术团队的刚需。无论是架构师画系统拓扑&#xff0c;产品经理拆解需求流程&#xff0c;还是开发者在白…

作者头像 李华
网站建设 2026/4/18 17:35:58

21、科技电视与网络技术全解析

科技电视与网络技术全解析 1. TechTV 简介 TechTV 是唯一一家专注展示科技对日常生活和世界影响的 24 小时有线电视网络。它通过制作和播出有关当下和未来科技新闻、事件、产品及人物的精彩且有深度的节目,让观众能及时了解科技动态。 TechTV 不仅是有线电视网络,还拥有一…

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

基于大数据技术的电影推荐系统的设计与实现_7eevo751--论文-爬虫 可视化1905

文章目录 系统截图项目简介大数据系统开发流程主要运用技术介绍爬虫核心代码展示结论源码文档获取定制开发/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 系统截图 基于大数据技术的电影推荐系统的设计与实现_7eevo751–论文-爬虫 可视化1905 …

作者头像 李华
网站建设 2026/4/17 18:50:56

百考通AI:如何用技术为学术科研按下“加速键”?

深夜两点&#xff0c;实验室的灯光还亮着。面对即将提交的论文&#xff0c;李博士正在与最后的数据分析图表“搏斗”&#xff0c;而隔壁宿舍的本科生小王则在为开题报告的结构发愁。类似的场景在无数高校和科研院所上演&#xff0c;学术写作这个看似系统化的过程&#xff0c;实…

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

告别熬夜整理!用AI自动生成专业实践报告,我是这样做的

深夜一点&#xff0c;电脑屏幕的光映在张明的脸上。他对着文档里仅有的三行字发呆——实习明天结束&#xff0c;5000字的实践报告还一个字没动。过去三个月的经历在脑海里翻涌&#xff0c;却不知从何写起。 这可能是许多大学生在实习季末的共同困境。分散的实习笔记、模糊的工作…

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

Excalidraw配合Markdown写作的工作流设计

Excalidraw 配合 Markdown 写作的工作流设计 在技术文档、产品设计和团队协作日益依赖远程沟通的今天&#xff0c;如何快速、清晰地表达复杂逻辑成为一大挑战。我们常常遇到这样的场景&#xff1a;会议中画了一张架构草图&#xff0c;会后却找不到&#xff1b;修改流程图时&am…

作者头像 李华