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

Stream流中的Map与flatMap的区别

Map与flatMap的基本概念

Map用于将流中的每个元素通过指定函数转换为另一个元素,生成一个一对一映射的新流。例如将字符串流转换为对应长度流:

List<String> words = Arrays.asList("a", "bb", "ccc");
List<Integer> lengths = words.stream().map(String::length).collect(Collectors.toList()); 
// 输出: [1, 2, 3]

flatMap用于将每个元素转换为流后合并所有流,形成一对多映射的扁平化结果。例如拆分字符串中的单词:

List<String> lines = Arrays.asList("hello world", "java stream");
List<String> words = lines.stream().flatMap(line -> Arrays.stream(line.split(" "))).collect(Collectors.toList());
// 输出: ["hello", "world", "java", "stream"]

核心区别对比

  • 输入输出关系
    Map保持原始流元素数量不变,flatMap可能改变元素数量(如拆分为多个子流后合并)

  • 返回值要求
    Map的Function返回普通对象,flatMap的Function必须返回Stream对象

  • 数据结构处理
    Map适合单一元素转换,flatMap适合处理嵌套集合(如List<List>)

典型应用场景

Map适用场景
数据类型转换(String→Integer)、属性提取(对象→ID)、简单计算(数值→平方值)

flatMap适用场景

  • 合并多个集合:List<List<Integer>> → List<Integer>
  • 分解复合结构:字符串句子→单词流、树节点→子树节点流
  • 过滤后展开操作:先filter再flatMap处理有效数据

性能注意事项

flatMap涉及流合并操作,可能产生更多临时对象。对于简单转换优先使用map,多层嵌套数据结构才使用flatMap。

代码示例对比

处理书籍作者场景:

// 使用map(保留嵌套结构)
List<Book> books = ...;
List<List<String>> authors = books.stream().map(Book::getAuthors).collect(Collectors.toList());// 使用flatMap(扁平化结构)
List<String> allAuthors = books.stream().flatMap(book -> book.getAuthors().stream()).collect(Collectors.toList());
http://www.dtcms.com/a/351639.html

相关文章:

  • 《从裸机到 GPU 共享:一步一步在 Kubernetes 上部署 NVIDIA GPU Operator + KAI Scheduler》
  • Python训练营打卡Day44-通道注意力(SE注意力)
  • 数字IC前端设计——前仿篇(VCS,DVE,Verdi)
  • 【Redis 进阶】-----哨兵 Sentinel(重点理解流程和原理)
  • 构建智能提示词工程师:LangGraph 的自动化提示词生成流程
  • 【远程软件VNC】经典远程软件VNC保姆级下载安装图文教程(附安装包)
  • STL——priority_queue的使用(快速入门详细)
  • 【硬件-笔试面试题-60】硬件/电子工程师,笔试面试题-60,(知识点:CAN总线通信原理)
  • 红黑树下探玄机:C++ setmultiset 的幕后之旅
  • Python在语料库建设中的应用:文本收集、数据清理与文件名管理
  • LeetCode刷题记录 | 长度最小的子数组 螺旋矩阵II
  • curl get post
  • GPMall 项目单机部署全流程GPMall:Redis、MariaDB、Kafka、Nginx 一步到位
  • Java微服务AI集成指南:LangChain4j vs SpringAI
  • 在线教育系统源码助力教培转型:知识付费平台开发的商业实践
  • Hyperledger Fabric官方中文教程-改进笔记(十七)-编写第一个链码
  • 售价2.5 万元的 Jetson Thor,能否开启人形机器人商业化新局面?
  • 利用AI进行ArcGISPro进行数据库的相关处理?
  • 如何利用ArcGIS探究环境与生态因子对水体、土壤、大气污染物的影响?
  • ROS2一键安装脚本:ROS2安装教程,快速搭建开发环境
  • 请求接口302 Moved Temporarily
  • 【数据价值化】数据资产入表指南:核心准则与实操路径
  • C语音初阶————指针2
  • .NET 6.0 日志处理之Serilog 写入到sql server(一)
  • OOM问题排查思路及解决方案
  • 【Notepad++免费版下载安装教程(附安装包)2025最新整理】
  • 如何用Wireshark捕获当前房间路由器和主机的数据包
  • iOS 26 正式版即将发布,Flutter 完成全新 devicectl + lldb 的 Debug JIT 运行支持
  • 剖析graph-rag中最核心的一步:切片文本如何输入到大模型并且构建整体的关系
  • 食用油平台:油香里的生活哲学课