news 2026/6/15 13:29:58

271. Java Stream API - 理解 Java Stream 的流水线模型:中间操作 vs 终端操作

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
271. Java Stream API - 理解 Java Stream 的流水线模型:中间操作 vs 终端操作

文章目录

  • 271. Java Stream API - 理解 Java Stream 的流水线模型:中间操作 vs 终端操作
      • 🧱 中间操作(`Intermediate Operation`):搭建流水线,不启动
      • 🔚 终端操作(Terminal Operation):触发流水线,处理数据
      • 🔁 串联多个中间操作
    • ⚠️ 常见误区:一个 Stream 只能使用一次!
      • 🛠 正确方式:**复用数据源,不复用 Stream 对象**
    • 🎯 中间 vs 终端操作对比总结
    • 💡 比喻辅助记忆:
    • 📌 补充建议:可练习的小题目

271. Java Stream API - 理解 Java Stream 的流水线模型:中间操作 vs 终端操作

JavaStream API中,我们构建的是一个“流水线式的数据处理过程”,就像搭建一条工厂生产线:

  • 每一道工序是一个中间操作(intermediate operation
  • 最后一道是一个终端操作(terminal operation,它才启动整条流水线。

🧱 中间操作(Intermediate Operation):搭建流水线,不启动

定义:一个方法返回一个Stream,就是一个中间操作。
作用:添加一个“处理环节”,但本身不触发数据处理。

Stream<String>stream=List.of("a","bb","ccc").stream();Stream<Integer>lengths=stream.map(str->str.length());// 中间操作

✅ 你只是“配置”了处理流程,没有处理数据。就像装了一个“长度计算”的机械臂,还没开电源。


🔚 终端操作(Terminal Operation):触发流水线,处理数据

定义:一个方法返回的不是Stream(或是void),那就是终端操作。
作用:触发数据从源头一个个“通过中间操作”,并产出结果。

inttotal=List.of("a","bb","ccc").stream().map(String::length)// 中间操作.reduce(0,Integer::sum);// 终端操作System.out.println("总长度 = "+total);// 输出 6

✅ 数据此时才真正流过map,然后被reduce聚合求和。


🔁 串联多个中间操作

varresult=List.of("apple","banana","avocado").stream().filter(s->s.startsWith("a"))// 过滤出以 a 开头的.map(String::toUpperCase)// 转大写.sorted()// 排序.toList();// 终端操作:生成结果列表System.out.println(result);// 输出: [APPLE, AVOCADO]

📌 注意:这些.filter(),.map(),.sorted()每一步都只是排流程,只有.toList()才触发执行


⚠️ 常见误区:一个 Stream 只能使用一次!

varstream=Stream.of(1,2,3,4);// 第一次使用,合法varmapped=stream.map(i->i+1);// 第二次使用,❌ 非法!stream 已经用过varlist=stream.toList();// 会抛 IllegalStateException

💥 错误信息:

java.lang.IllegalStateException:stream has already been operated upon or closed

🛠 正确方式:复用数据源,不复用 Stream 对象

// 正确做法:重新从集合创建新 Streamvarsource=List.of(1,2,3,4);varmapped=source.stream().map(i->i+1).toList();// ✅varfiltered=source.stream().filter(i->i%2==0).toList();// ✅

🎯 中间 vs 终端操作对比总结

操作类型特征描述是否触发处理返回值类型示例方法
中间操作构建流水线,返回新的 Stream❌ 否Streammap,filter,sorted
终端操作启动流水线,返回结果或副作用✅ 是Stream类型collect,toList,reduce,forEach

💡 比喻辅助记忆:

  • 中间操作:就像在工厂安装传送带上的“加工模块”,还没有开机。
  • 终端操作:按下启动按钮,产品才真正开始加工和流转。

📌 补充建议:可练习的小题目

  1. 使用map()filter()构建一个处理流程,但不要调用终端操作,验证是否执行了逻辑?
  2. 设计一个流程:过滤出偶数,再平方,然后求和。
  3. 尝试复用一个Stream对象,观察异常,并改用集合重新创建 Stream。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/15 0:35:31

如何快速部署中文车牌识别系统:面向开发者的完整实战指南

你是否正在寻找一个既高效又易于部署的中文车牌识别解决方案&#xff1f;HyperLPR3框架正是你需要的答案。这个基于深度学习的开源项目专门针对中文车牌识别场景优化&#xff0c;提供了从数据标注到模型部署的全套工具链&#xff0c;让你能够在短时间内构建专业的车牌识别应用。…

作者头像 李华
网站建设 2026/6/15 12:18:56

微服务数据安全新范式:SQLCipher分布式加密架构深度解析

微服务数据安全新范式&#xff1a;SQLCipher分布式加密架构深度解析 【免费下载链接】sqlcipher sqlcipher/sqlcipher: 是一个基于 MySQL 和 SQLite 数据库的加密库&#xff0c;它提供了一个加密的数据库&#xff0c;适用于多种数据库管理。适合用于数据库加密&#xff0c;特别…

作者头像 李华
网站建设 2026/6/12 21:41:00

AI之Course之AgenticAI:生成式AI智能体 —— 通过理解智能体的核心组件与迭代开发流程(涵盖近期智能体空间进展),学习构建高级AI智能体—架构、工具与认知——从基础原理到生产实践的全

AI之Course之AgenticAI/Generative AI Agents&#xff1a;生成式AI智能体 —— 通过理解智能体的核心组件与迭代开发流程&#xff08;涵盖近期智能体空间进展&#xff09;&#xff0c;学习构建高级AI智能体—架构、工具与认知——从基础原理到生产实践的全景指南 导读&#xf…

作者头像 李华
网站建设 2026/6/15 13:15:26

Linux实时调度深度解析:从理论到实战的SCHED_FIFO与SCHED_RR应用指南

你是否曾经遇到过这样的场景&#xff1a;在工业控制系统中&#xff0c;一个关键传感器数据的处理被延迟&#xff0c;导致整个生产线停机&#xff1f;或者在音视频流处理时&#xff0c;偶尔出现的卡顿让用户体验大打折扣&#xff1f;这些问题的根源往往在于任务调度策略的选择不…

作者头像 李华
网站建设 2026/6/15 12:24:13

警惕:为什么“传统MIS + AI”是一条走不通的死路?

过去几年&#xff0c;我们见证了很多企业在原有 ERP、CRM 或各类 MIS 系统上“打补丁”——加入一个 AI 语音助手、一个智能推荐模块&#xff0c;就声称自己完成了“AI 升级”。然而&#xff0c;这种“AI 加法”模式&#xff0c;正在成为扼杀企业未来竞争力的最大陷阱。传统 MI…

作者头像 李华
网站建设 2026/6/15 7:27:46

终极指南:gemma.cpp模型转换工具完整使用教程

终极指南&#xff1a;gemma.cpp模型转换工具完整使用教程 【免费下载链接】gemma.cpp 适用于 Google Gemma 模型的轻量级独立 C 推理引擎。 项目地址: https://gitcode.com/GitHub_Trending/ge/gemma.cpp 还在为AI模型部署到生产环境而烦恼吗&#xff1f;gemma.cpp提供的…

作者头像 李华