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

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。
http://www.cnnetsun.cn/news/81314.html

相关文章:

  • 生成对抗网络:从代码到创意的商业变现指南
  • 【R与Python函数调用适配全攻略】:掌握跨语言协作的5大核心技术
  • R与Python库版本同步实践全解析(20年专家亲授避坑手册)
  • 心法利器[147] | Agent,是大模型落地的殊途同归
  • 金融风险管理实战(R语言蒙特卡洛模拟大揭秘)
  • 帮我推荐短视频seo电话
  • 金融风险建模不再难,R语言压力测试十大关键步骤全公开
  • 基于Java的取水许可与征费智慧管理系统的设计与实现全方位解析:附毕设论文+源代码
  • 【实践篇】我在某AI Native系统架构设计与实现上做了一点尝试:双路径架构
  • 气象数据分析的秘密武器:R语言季节性分解技术首次完整披露
  • 揭秘R语言在环境监测中的数据同化魔法:5个关键步骤实现精准预测
  • 塔吉特成功率低?自养号技术底层原理与落地步骤
  • 【R语言量子电路优化实战】:掌握5大核心技巧提升量子算法效率
  • 内存管理 - 内存泄漏 - 排查、预防策略
  • 全球服贸联盟:世界主要城市数字经济创新与知识产权发展指数报告2025(摘要)
  • 冰途缓行,雪路安驾:冰雪天气安全驾驶指南
  • DuckDB Go客户端深度开发指南:构建高性能嵌入式分析应用
  • 关于 windows 批处理文件 echo 中文后显示乱码的问题
  • 基于springboot的旅游线路定制微信小程序_u13nyaer_sf062
  • 让动态代理真正落地:在 Java 与 ABAP 里生成并持久化 Proxy 类的工程化实践
  • 用 SWE2 监听 SAP BOR 事件:以 BUS1178 产品创建为例,实时触发邮件通知与调试技巧
  • CentOS Stream 9入门学习教程,从入门到精通,Linux日志分析工具及应用 —语法详解与实战案例(17)
  • Lazy Loading、 Singleton 与 Bridge:在 JavaScript 和 ABAP 里把对象初始化写得更省、更稳、更易扩展
  • 用 ABAP 模拟 Currying:把参数绑定这件事做到极致
  • 错过这8个R语言函数,你就等于放弃了环境数据的准确性
  • CIKM‘25 | 联盟营销场景下,基于时空动态网络的两阶段传播规模预测
  • 音频格式完全指南:如何为不同场景选择最佳格式
  • DataEase 终极部署指南:从零到一的完整教程
  • 智能开发环境下的 Diagram-as-Code 实践:MCP Mermaid 技术链路拆解
  • 为什么你的多因素分析总被退稿?R语言正确姿势一次性讲清楚