news 2026/9/3 1:25:04

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/9/2 11:38:46

19、Windows XP网络故障排查与命令使用指南

Windows XP网络故障排查与命令使用指南 在使用Windows XP系统构建和维护家庭网络时,我们可能会遇到各种网络问题。以下将为大家介绍常见网络问题的排查方法、系统自带的帮助工具,以及一些实用的网络命令。 网络问题排查 当遇到网络连接问题时,可按以下步骤进行排查: 1.…

作者头像 李华
网站建设 2026/9/2 19:42:45

从响应到部署提速7倍:Open-AutoGLM驱动DevOps智能升级,你跟上了吗?

第一章&#xff1a;从响应到部署提速7倍&#xff1a;Open-AutoGLM重塑DevOps效能边界在现代软件交付体系中&#xff0c;开发与运维的协同效率直接决定产品迭代速度。Open-AutoGLM 作为新一代开源自动化推理框架&#xff0c;通过深度融合大语言模型&#xff08;LLM&#xff09;与…

作者头像 李华
网站建设 2026/9/2 23:31:13

当深度学习遇上学术写作:百考通AI如何重塑科研全流程体验

深夜的实验室&#xff0c;只有键盘敲击声与偶尔的叹息交织。屏幕上的文献密密麻麻&#xff0c;而文档里的字数增长缓慢。这可能是许多科研工作者与学生再熟悉不过的场景。 从选题的迷茫、文献的浩瀚、撰写的艰辛&#xff0c;到降重的烦恼、格式的繁琐——学术写作是一条充满挑战…

作者头像 李华
网站建设 2026/9/3 0:21:55

事务消息能力对决:RocketMQ天然支持 vs Kafka/RabbitMQ替代方案

在分布式系统中&#xff0c;事务一致性是绕不开的核心难题。尤其是在“本地业务操作”与“消息发送”需原子性完成的场景&#xff08;如订单创建成功后必须同步发送库存扣减消息&#xff09;&#xff0c;普通消息极易出现“业务成功但消息未发”“消息已发但业务失败”的不一致…

作者头像 李华
网站建设 2026/9/2 14:28:50

Excalidraw移动端体验如何?跨设备使用全评测

Excalidraw移动端体验如何&#xff1f;跨设备使用全评测 在通勤的地铁上突然想到一个系统架构的灵感&#xff0c;掏出手机打开浏览器&#xff0c;三句话让AI生成初稿&#xff0c;再用手指拖拽调整布局——这听起来像未来的工作方式&#xff0c;但今天用 Excalidraw 就能实现。…

作者头像 李华
网站建设 2026/9/2 18:50:39

Excalidraw同步延迟问题优化策略

Excalidraw同步延迟问题优化策略 在远程协作日益深入的今天&#xff0c;团队对实时交互工具的需求早已超越“能用”的范畴&#xff0c;转向“好用、流畅、无感协同”。Excalidraw作为一款以手绘风格和极简体验著称的开源白板工具&#xff0c;正被越来越多的技术团队用于架构设计…

作者头像 李华