294. Java Stream API - 对流进行归约

文章目录

  • 294. Java Stream API - 对流进行归约
      • 🎯 什么是归约(Reduction)?
      • ✅ 什么是终端操作?
        • 🔔 注意事项:
    • 🧠 使用 `BinaryOperator` 对流进行归约
      • 🧪 示例一:经典求和
      • 🔁 示例二:使用 BinaryOperator 改写
      • 🧪 示例三:计算最大值(MAX)
    • ☕ Stream API 中的 reduce() 方法
      • 🧪 示例四:带初始值的 reduce(避免 Optional)
    • 📌 小结
    • 🧠 延伸思考

294. Java Stream API - 对流进行归约

🎯 什么是归约(Reduction)?

Java Stream API中,所谓的归约操作,其实就像 SQL 中的聚合操作 —— 比如SUM(),MAX()等。我们通过一个终端操作(Terminal Operation)来将流中的多个元素聚合成一个结果


✅ 什么是终端操作?

终端操作会触发整个流的执行,常见的包括:

  • collect()(如:collect(Collectors.toList())
  • reduce()(本节主角)
  • forEach()
  • count()
  • anyMatch(),allMatch(), 等
🔔 注意事项:
  1. 没有终端操作的流不会执行任何处理!
    • 如果你看到一个只调用了map()filter()但没有终端操作的流,那就是个 bug。
  2. 每个 Stream 实例只能执行一次终端操作!
    • 流一旦执行终端操作,就会“关闭”,不能再使用,否则会抛出IllegalStateException

🧠 使用BinaryOperator对流进行归约

Javareduce()方法的核心,就是使用一个二元操作符(BinaryOperator)将两个元素合并成一个,不断迭代直到只剩一个值。


🧪 示例一:经典求和

我们先用传统 for 循环来实现整数列表求和:

List<Integer>ints=List.of(3,6,2,1);intsum=ints.get(0);for(inti=1;i<ints.size();i++){sum+=ints.get(i);}System.out.println("sum = "+sum);

🟢 输出:

sum=12

🔍 这个过程就是不断把前面计算的“部分和”与下一个元素相加。


🔁 示例二:使用 BinaryOperator 改写

我们可以将“加法”逻辑抽象成一个BinaryOperator

List<Integer>ints=List.of(3,6,2,1);BinaryOperator<Integer>sum=(a,b)->a+b;intresult=ints.get(0);for(inti=1;i<ints.size();i++){result=sum.apply(result,ints.get(i));}System.out.println("sum = "+result);

🟢 输出:

sum=12

🎯 好处:只需要更换BinaryOperator,就能实现其他聚合操作!


🧪 示例三:计算最大值(MAX)

只需将 BinaryOperator 换成一个“取较大值”的函数:

List<Integer>ints=List.of(3,6,2,1);BinaryOperator<Integer>max=(a,b)->a>b?a:b;intresult=ints.get(0);for(inti=1;i<ints.size();i++){result=max.apply(result,ints.get(i));}System.out.println("max = "+result);

🟢 输出:

max=6

☕ Stream API 中的 reduce() 方法

现在让我们用Stream 的 reduce() 方法来实现相同逻辑。reduce()有多个重载版本,这里我们使用最基础的一种:

List<Integer>ints=List.of(3,6,2,1);Optional<Integer>sum=ints.stream().reduce((a,b)->a+b);sum.ifPresent(s->System.out.println("sum = "+s));

🟢 输出:

sum=12

🔎reduce()返回的是Optional<T>,因为当流为空时,没有结果。


🧪 示例四:带初始值的 reduce(避免 Optional)

List<Integer>ints=List.of(3,6,2,1);intsum=ints.stream().reduce(0,(a,b)->a+b);System.out.println("sum = "+sum);

🟢 输出:

sum=12

🎯 传入初始值后,reduce()会从这个值开始进行归约,并返回确定的类型(非 Optional)。


📌 小结

特性说明
✅ 终端操作reduce()是一种终端操作,用于聚合流元素
🔄 可变操作只需变换BinaryOperator即可进行加总、取最大、最小等操作
💡 Optional 处理不传初始值时返回Optional,可避免空流 NPE
♻️ 不可复用Stream 使用一次后即失效,请勿复用

🧠 延伸思考

  • reduce()可以用于更多复杂的聚合计算,例如拼接字符串、合并集合等。
  • 在并行流中(parallelStream()),reduce()的初始值需要满足结合律,以确保并发结果一致。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1167906.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

百考通AI开题报告功能:智能构建研究蓝图,轻松搞定高质量开题

撰写开题报告&#xff0c;是每位学生迈入正式研究前必须跨越的关键门槛。它不仅要清晰界定研究问题&#xff0c;还需系统梳理文献、科学设计方法、合理规划路径&#xff0c;并阐明研究价值——任何一个环节的疏漏&#xff0c;都可能导致开题受阻。然而&#xff0c;面对繁杂的学…

百考通AI开题报告功能:用智能写作破解“开题难”,高效开启科研之旅

“开题报告怎么写&#xff1f;”——这是无数学生在科研起步阶段最常面临的困惑。选题方向模糊、文献综述杂乱、研究方法空泛、逻辑结构松散……这些问题不仅拖慢进度&#xff0c;还容易导致开题反复修改甚至被退回。如今&#xff0c;百考通AI平台推出的“开题报告”写作功能&a…

农产品销售数据分析|基于Python 农产品销售数据分析系统(源码+数据库+文档)

农产品销售数据分析 目录 基于PythonDjango农产品销售数据分析系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于PythonDjango农产品销售数据分析系统 一、前言 博…

百考通AI开题报告功能:智能生成专业框架,让开题写作事半功倍

开题报告是学术研究的“第一块基石”&#xff0c;它不仅决定课题能否顺利立项&#xff0c;更直接影响后续研究的深度与方向。然而&#xff0c;对许多学生而言&#xff0c;撰写开题报告却是一场充满挑战的“硬仗”&#xff1a;选题太大难以聚焦、文献堆砌缺乏主线、研究方法描述…

基于STM32的车内环境检测和儿童滞留报警系统(开题报告)

本科毕业论文(设计)开题报告 姓名 学号 专业 通信工程 题目 基于STM32的车内环境检测和儿童滞留报警系统 选题意义、研究现状及可行性分析 1、选题意义 汽车在给人们出行带来便利的同时也引发了一些儿童安全问题,尤其是由于父母的疏忽导致儿童被锁车内致危的事件频发。儿童滞…

ACPI!ACPIBuildProcessRunMethodPhaseCheckSta和ACPI!ACPIGetConvertToDevicePresence调试断点搜集

ACPI!ACPIBuildProcessRunMethodPhaseCheckSta和ACPI!ACPIGetConvertToDevicePresence调试断点搜集ACPI!ACPIBuildDeviceExtension ACPI!ACPIDetectPdoDevices ACPI!ACPIDetectPdoDevices0x122ACPI!ACPIBuildDeviceDpcACPI!ACPIBuildProcessGenericList 关键1 ACPI!ACPI…

校园食堂点餐|基于Python 校园食堂点餐系统(源码+数据库+文档)

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

python基于django校园二手交易平台管理系统

目录基于Django的校园二手交易平台管理系统摘要关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;基于Django的校园二手交易平台管理系统摘要 校园二手交易平台是为高校学生提供的便捷…

百考通AI开题报告功能:告别“开题卡壳”,智能生成逻辑清晰、结构完整的专业初稿

对许多学生来说&#xff0c;开题报告是毕业路上的第一道“难关”——明明有研究想法&#xff0c;却不知如何系统表达&#xff1b;读了不少文献&#xff0c;却理不清研究脉络&#xff1b;想设计方法&#xff0c;却写得空洞模糊。结果往往是反复修改、进度拖延&#xff0c;甚至因…

计算机毕业设计hadoop+spark+hive旅游推荐系统 旅游可视化系统 地方旅游网站 旅游爬虫 旅游管理系统 大数据毕业设计 机器学习 深度学习 知识图谱

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 技术范围&#xff1a;Sprin…

YOLOv11_OBB(目标旋转框)模型从标签制作到训练推理

前言 由于目前全网大都是水平框检测的教程&#xff0c;本博客使用YOLOv11_OBB检测&#xff0c;从打标签&#xff0c;到训练自己的数据集&#xff0c;显示目标的旋转框检测教程。 目标检测框和目标旋转框的区别&#xff1a; 旋转边界框&#xff08;OBB&#xff09;包含一个额外的…

从ACPI!AMLILoadDDB中的ACPI!SyncLoadDDB到ACPI!ACPICallBackLoad

从ACPI!AMLILoadDDB中的ACPI!SyncLoadDDB到ACPI!ACPICallBackLoadrc LoadDDB(pctxt,pDSDT, gpnsNameSpaceRoot, &powner);if (rc STATUS_SUCCESS){rc SyncLoadDDB(pctxt);}#ifdef DEBUG{KIRQL oldIrql;gdwfAMLI & ~AMLIF_LOADING_DDB;KeAcquireSpinLock( &gdw…

百考通AI开题报告功能:智能构建学术起点,让高质量开题触手可及

开题报告是科研工作的“导航图”&#xff0c;它不仅框定研究边界、明确问题意识&#xff0c;还体现研究者的逻辑思维与学术素养。然而&#xff0c;现实中许多学生在撰写时常常陷入“有想法却写不出”“读了很多却理不清”“方法模糊结构散”的困境&#xff0c;导致开题反复修改…

IP分片与组装

IP 分片是 TCP/IP 协议栈中网络层&#xff08;IP 层&#xff09;的核心机制&#xff0c;目的是解决 “IP 报文长度超过数据链路层 MTU 限制” 的传输问题 —— 确保大型 IP 数据报能通过不同 MTU 的网络链路&#xff08;如以太网、PPP 链路&#xff09;成功送达目标主机。以下从…

jQuery 版本文件及相关信息汇总

一、核心结论​ 截至2025年1月&#xff0c;jQuery 的最新稳定版本为 3.7.1&#xff08;2023年7月发布&#xff09;&#xff0c;4.0 版本仍处于测试阶段&#xff08;2025年8月发布 Release Candidate 1&#xff0c;未正式推出&#xff09;。当前主流使用的版本为 3.x 系列&…

python基于django框架的健康档案网站的设计与实现

目录健康档案网站的设计与实现摘要关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;健康档案网站的设计与实现摘要 基于Django框架的健康档案网站旨在为用户提供便捷的个人健康数据管…

ARP欺骗的原理与防御措施

ARP 欺骗&#xff08;也叫 ARP 毒化&#xff09;的核心是利用ARP 协议无身份验证的漏洞&#xff08;主机收到 ARP 应答时&#xff0c;会直接更新自身 ARP 缓存表&#xff0c;不管是否发送过对应请求&#xff09;&#xff0c;让攻击者&#xff08;图中 “主机 M”&#xff09;伪…

python基于django框架的大学生平时成绩管理系统 四个角色45s2bez3

目录系统概述角色功能设计技术实现应用价值关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;系统概述 Python基于Django框架的大学生平时成绩管理系统是一个多角色协作的在线平台&am…

springboot基于微信小程序的粤语文化传播平台的设计与开发

背景分析随着全球化与数字化发展&#xff0c;地域文化面临同质化冲击&#xff0c;粤语作为岭南文化的重要载体&#xff0c;其传承与传播需求日益凸显。微信小程序凭借低门槛、高普及率&#xff08;覆盖超10亿用户&#xff09;及社交属性&#xff0c;成为文化传播的高效工具。Sp…

百考通AI开题报告功能:让开题写作从“压力源”变为“加速器”

对无数学生而言&#xff0c;开题报告曾是毕业路上的“拦路虎”——选题反复修改、结构混乱不清、方法描述空洞、文献堆砌无逻辑……不仅耗费大量时间精力&#xff0c;还常常因不符合导师或学院要求而被打回重写。如今&#xff0c;百考通AI平台推出的“开题报告”写作功能&#…