当前位置: 首页 > news >正文

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]
http://www.jsqmd.com/news/118419/

相关文章:

  • 2025年rohs检测仪优质供应商推荐,rohs检测仪专业制造商靠谱厂家全解析 - mypinpai
  • Excalidraw反向代理配置(Nginx/Apache)
  • Excalidraw字体渲染机制详解:保持手绘风格一致性
  • 2025年12月制造业咨询公司选购终极指南:附五大领先机构全景对比与推荐 - 十大品牌推荐
  • 【无代码AI时代来临】:Open-AutoGLM让你7天掌握智能流程构建
  • 4、文档编辑与图像处理实用指南
  • 2025年可靠的实验室球磨机公司、卧式行星球磨机工厂年度排名 - myqiye
  • 响应速度提升10倍的秘密武器,Open-AutoGLM用户都在问的优化方案,你还没用?
  • 多巴胺:驱动人类的分子,现代生活的陷阱与救赎
  • Excalidraw高可用架构设计方案
  • 彩色无纺布服务商哪家性价比高?哪家质量靠谱? - mypinpai
  • 深入解析:【每天一个AI小知识】:什么是卷积神经网络?
  • 5、图像打印、幻灯片制作与媒体播放指南
  • 2025年12月制造业咨询公司怎么选?五大实力派机构全方位对比与推荐 - 十大品牌推荐
  • 机器学习模型评估指标:R²分数与均方误差(MSE)详解
  • 企业管理咨询公司哪家强?2025年12月最新市场盘点与十大实力机构推荐 - 十大品牌推荐
  • 6、电脑文件操作与媒体播放全攻略
  • Excalidraw与Google Drive同步集成方法
  • Open-AutoGLM脚本库深度解析(99%工程师忽略的性能优化技巧)
  • 2025年资深环保工程师推荐:当前最值得关注的5家无害化设备厂家全方位横评。 - 十大品牌推荐
  • Open-AutoGLM你不知道的隐藏功能:高精度错误分类模型一键部署方案
  • XBOX精英二代霍尔板机故障修复及校准
  • 冬至是农历年计算的基点
  • 8、Windows Vista 使用指南:用户管理、共享设置与笔记本功能
  • 9、笔记本电脑使用与网络连接全攻略
  • Excalidraw数据隐私保护机制详解
  • 9个AI论文工具,专科生轻松搞定毕业写作!
  • Excalidraw负载均衡实施要点
  • 8、Windows 7个性化设置全攻略
  • 从“背锅侠“到“项目守门人“:我的角色蜕变