news 2026/10/21 14:07:55

279. Java Stream API - Stream 拼接的两种方式:concat() vs flatMap()

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
279. Java Stream API - Stream 拼接的两种方式:concat() vs flatMap()

文章目录

  • 279. Java Stream API - Stream 拼接的两种方式:`concat()` vs `flatMap()`
      • 🎯 本节目标
    • 🧪 背景问题:多个集合如何组合成一个流?
    • ✅ 方式一:使用 `Stream.concat()`
      • 📌 特点:
      • 🔨 示例代码:
      • 🔽 输出:
    • ❌ 局限:只能拼接两个流!
    • ✅ 方式二:使用 `flatMap()` 动态拼接多个流
      • 📌 特点:
      • 🔨 示例代码:
      • 🔽 输出:
    • 🧠 为什么 `concat()` 不用可变参数(`varargs`)?
    • 🔍 性能对比与底层机制
      • 🚦 关于 SIZED 特性小贴士:
    • 🔚 总结选择建议
    • 🔁 拓展练习题
      • ☑️ 合并三个列表并打印奇数元素

279. Java Stream API - Stream 拼接的两种方式:concat()vsflatMap()


🎯 本节目标

  • 理解Stream.concat()和flatMap()实现流拼接的方式
  • 掌握两种方法的使用场景、性能差异与行为特性
  • 明确什么时候使用哪种方式更合适

🧪 背景问题:多个集合如何组合成一个流?

假设我们有多个List<Integer>,我们想要将它们的元素拼接成一个大集合。


✅ 方式一:使用Stream.concat()

📌 特点:

  • 适用于拼接两个流
  • 顺序是:先处理第一个流,再处理第二个流
  • 返回的流具有SIZED属性(已知大小)

🔨 示例代码:

List<Integer>list0=List.of(1,2,3);List<Integer>list1=List.of(4,5,6);List<Integer>concat=Stream.concat(list0.stream(),list1.stream()).toList();System.out.println("concat = "+concat);

🔽 输出:

concat=[1,2,3,4,5,6]

🧠 类比:就像把两个数组首尾缝在一起,中间没有拆分、合并的额外动作。


❌ 局限:只能拼接两个流!

如果你有 3 个、4 个、N 个流,就得嵌套调用:

Stream<Integer>result=Stream.concat(Stream.concat(list0.stream(),list1.stream()),list2.stream());

📉 问题:每concat一次,就会生成一个临时中间流,内存和效率都有开销!


✅ 方式二:使用flatMap()动态拼接多个流

📌 特点:

  • 支持多个流拼接(不限数量)
  • 性能更优:只创建一个外层流
  • 缺点是:返回的流没有 SIZED 属性(大小未知)

🔨 示例代码:

List<Integer>list0=List.of(1,2,3);List<Integer>list1=List.of(4,5,6);List<Integer>list2=List.of(7,8,9);List<Integer>flatMap=Stream.of(list0.stream(),list1.stream(),list2.stream()).flatMap(Function.identity())// 展平流.toList();System.out.println("flatMap = "+flatMap);

🔽 输出:

flatMap=[1,2,3,4,5,6,7,8,9]

🧠 类比:像是一个“展开三明治”——先把所有流打包,再逐个展开并合并元素。


🧠 为什么concat()不用可变参数(varargs)?

你可能好奇:为什么concat()不能接收多个流,比如这样:

Stream.concat(stream1,stream2,stream3);// ❌ 不支持

📌 原因是:

  • 每次concat()只能拼接两个流
  • 若要拼接多个,建议使用flatMap()来减少中间流的创建

🔍 性能对比与底层机制

特性concat()flatMap()
支持多个流拼接否(只能两个)✅ 支持任意多个流
是否创建中间临时流是(每两个拼接都创建)否(只创建一个外层流)
返回流是否有大小信息✅ 是(SIZED)❌ 否(不再是 SIZED)
内部优化可能性更易优化较难优化

🚦 关于 SIZED 特性小贴士:

  • 如果你使用Stream.concat(),结果流的大小是可预知的 →Stream会自动标记为SIZED
  • 如果使用flatMap(),因为展开过程中元素数不确定,所以结果流被标记为UNKNOWN

🔧 有些操作(如并行流优化、预分配内存)依赖SIZED特性,因此concat在某些场景下有优势。


🔚 总结选择建议

场景建议使用
只拼接两个流✅concat()
拼接多个流✅flatMap()
希望保留流大小信息(如并行优化)✅concat()
性能优先、避免中间流创建✅flatMap()

🔁 拓展练习题

☑️ 合并三个列表并打印奇数元素

List<Integer>combined=Stream.of(list0.stream(),list1.stream(),list2.stream()).flatMap(Function.identity()).filter(n->n%2!=0).toList();System.out.println("odd numbers = "+combined);
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/15 19:02:47

EASE 4.0:重新定义专业声学设计体验

EASE 4.0&#xff1a;重新定义专业声学设计体验 【免费下载链接】EASE4.0安装包 EASE 4.0是一款专业的音响和声学设计软件&#xff0c;专为音响工程师和声学设计师打造&#xff0c;提供精准的声场模拟与分析功能。软件集成了丰富的设计工具&#xff0c;支持详细的声场分析和多样…

作者头像 李华
网站建设 2026/10/13 13:12:40

LightX2V:流式推理技术如何重新定义实时视频生成边界

LightX2V&#xff1a;流式推理技术如何重新定义实时视频生成边界 【免费下载链接】lightx2v 项目地址: https://gitcode.com/GitHub_Trending/li/lightx2v 在AI视频生成领域&#xff0c;我们正见证一场从"批量处理"到"实时交互"的深刻变革。当传统…

作者头像 李华
网站建设 2026/10/22 0:52:22

揭秘Docker运行时安全盲区:Falco如何实现毫秒级异常行为告警

第一章&#xff1a;揭秘Docker运行时安全盲区&#xff1a;Falco如何实现毫秒级异常行为告警在容器化环境中&#xff0c;Docker的广泛应用带来了部署效率的提升&#xff0c;但也引入了新的运行时安全挑战。传统防火墙和主机安全工具难以捕捉容器内部的异常进程执行、文件篡改或非…

作者头像 李华
网站建设 2026/10/19 6:22:09

Docker容器健康检查超时配置全解析(超时问题根源大揭秘)

第一章&#xff1a;Docker容器健康检查超时配置全解析在构建高可用的容器化应用时&#xff0c;准确配置健康检查机制至关重要。Docker 提供了内置的 HEALTHCHECK 指令&#xff0c;允许用户自定义容器运行状态的检测逻辑&#xff0c;其中超时时间是影响判断准确性的核心参数之一…

作者头像 李华
网站建设 2026/10/18 16:48:39

基于java+ vue自习室预订系统(源码+数据库+文档)

自习室预订 目录 基于springboot vue自习室预订系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于springboot vue自习室预订系统 一、前言 博主介绍&#xff1a…

作者头像 李华
网站建设 2026/10/21 13:18:17

别再让容器“假健康”了!深入剖析健康检查超时配置的5大陷阱

第一章&#xff1a;别再让容器“假健康”了&#xff01;深入剖析健康检查超时配置的5大陷阱在现代微服务架构中&#xff0c;容器健康检查是保障系统稳定性的关键机制。然而&#xff0c;许多团队因忽视健康检查的超时配置细节&#xff0c;导致容器被错误地标记为“健康”&#x…

作者头像 李华