news 2026/4/16 15:01:06

297. Java Stream API - Java Stream API 中的 reduce() 方法详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
297. Java Stream API - Java Stream API 中的 reduce() 方法详解

文章目录

  • 297. Java Stream API - Java Stream API 中的 `reduce()` 方法详解
    • 🎯 第一种:`reduce(identity, accumulator)`
      • ✅ 特点:
      • 📌 示例讲解:
      • ⚠️ 注意:你提供的 identity 必须真的是该操作的单位元!
        • 错误示例:
        • 正确示例:
    • 🧩 第二种:`reduce(accumulator)` → 返回 `Optional<T>`
      • ✅ 特点:
      • 📌 示例:取最大值
      • 🚨 如果流为空怎么办?
      • ✅ 推荐用法:
    • 🔁 第三种:`reduce(identity, accumulator, combiner)` → 并行流专用
      • ✅ 特点:
      • 🧠 背景理解:
      • 📌 示例:统计字符串长度总和
      • 💡 提取 mapper 表达更清晰:
    • 🧠 三种 reduce() 方法对比表:
    • 📚 结语:什么时候用哪种?

297. Java Stream API - Java Stream API 中的reduce()方法详解

在 Java Stream 中,reduce()是一个非常核心的终端操作,它可以将流中的所有元素通过一个二元操作折叠成一个最终结果。Stream API 提供了三个重载版本,今天我们将一一解析:


🎯 第一种:reduce(identity, accumulator)

这是最常用也最安全的一种形式,它接受两个参数:

Treduce(Tidentity,BinaryOperator<T>accumulator)

✅ 特点:

  • 提供了单位元(identity element),即当流为空时返回的默认值。
  • 不会返回 Optional,因为总能返回 identity。
  • 可用于并行流,并行友好。

📌 示例讲解:

List<Integer>ints=List.of(3,6,2,1);intsum=ints.stream().reduce(0,Integer::sum);System.out.println("sum = "+sum);// 输出:12

这个过程等价于:

intresult=0;for(inti:ints){result=result+i;}

即使ints是个空集合,reduce()也会返回 0,不会抛异常!


⚠️ 注意:你提供的 identity 必须真的是该操作的单位元!

如果你写错了,Stream API 不会提示你错误,但结果会悄悄错掉!

错误示例:
Stream<Integer>ints=Stream.of(0,0,0,0);intsum=ints.reduce(10,Integer::sum);// ❌ 错误的 identitySystem.out.println("sum = "+sum);// 输出 10,不是 0!
正确示例:
Stream<Integer>ints=Stream.of(0,0,0,0);intsum=ints.reduce(0,Integer::sum);System.out.println("sum = "+sum);// ✅ 输出:0

✅ 提醒学员:identity 是你负责提供的,必须和操作一致!


🧩 第二种:reduce(accumulator)→ 返回Optional<T>

Optional<T>reduce(BinaryOperator<T>accumulator)

✅ 特点:

  • 没有 identity,所以返回结果可能为空(比如遇到空流)。
  • 使用Optional包装结果。

📌 示例:取最大值

Stream<Integer>ints=Stream.of(2,8,1,5,3);Optional<Integer>optionalMax=ints.reduce((i1,i2)->i1>i2?i1:i2);System.out.println("result = "+optionalMax.orElseThrow());

🟢 输出:

result=8

🚨 如果流为空怎么办?

Stream<Integer>empty=Stream.empty();Optional<Integer>optional=empty.reduce(Integer::min);System.out.println(optional.orElse(-1));// 安全返回默认值 -1

✅ 推荐用法:

从 Java 10 起,推荐使用orElseThrow()替代get()

optional.orElseThrow();// 安全,可读性好

不推荐:

optional.get();// 会抛出 NoSuchElementException

🔁 第三种:reduce(identity, accumulator, combiner)→ 并行流专用

<U>Ureduce(Uidentity,BiFunction<U,?superT,U>accumulator,BinaryOperator<U>combiner);

✅ 特点:

  • 支持映射 + 累加一步完成。
  • identity是 combiner 的单位元。
  • 可以把元素转换为另一种类型(泛型 U)。

🧠 背景理解:

适合并行流时,流被切分成多个片段,每个片段部分归约后,需要用combiner合并成总结果。


📌 示例:统计字符串长度总和

Stream<String>strings=Stream.of("one","two","three","four");intresult=strings.reduce(0,// identity 是 0(partialSum,str)->partialSum+str.length(),// accumulatorInteger::sum// combiner);System.out.println("sum = "+result);// 输出:15

💡 提取 mapper 表达更清晰:

Function<String,Integer>mapper=String::length;BiFunction<Integer,String,Integer>accumulator=(partialSum,str)->partialSum+mapper.apply(str);

这样表达更清楚:映射 + 累加分别负责什么角色。


🧠 三种 reduce() 方法对比表:

方法签名返回类型是否要求 identity是否返回 Optional空流行为并行友好性
reduce(identity, accumulator)T✅ 是❌ 否返回 identity
reduce(accumulator)Optional<T>❌ 否✅ 是返回 Optional.empty()❌ 不推荐
reduce(identity, accumulator, combiner)U✅ 是❌ 否返回 identity✅ 强推荐并行用

📚 结语:什么时候用哪种?

需求使用方法
你知道 identity,且只处理本类型reduce(identity, accumulator)
没有 identity,比如min()max()reduce(accumulator),处理 Optional
需要先映射再 reduce,或并行流合并reduce(identity, accumulator, combiner)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/14 9:42:12

GitHub 热榜项目 - 日榜(2026-01-19)

GitHub 热榜项目 - 日榜(2026-01-19) 生成于&#xff1a;2026-01-19 统计摘要 共发现热门项目&#xff1a; 9 个 榜单类型&#xff1a;日榜 本期热点趋势总结 本期GitHub热榜显示AI工具本地化与实用化成为核心趋势&#xff0c;AionUi作为多模型AI编程助手整合平台&#xf…

作者头像 李华
网站建设 2026/4/14 17:57:59

ERNIE 4.5-A3B大模型开源:210亿参数文本生成新选择

ERNIE 4.5-A3B大模型开源&#xff1a;210亿参数文本生成新选择 【免费下载链接】ERNIE-4.5-21B-A3B-Base-Paddle 项目地址: https://ai.gitcode.com/hf_mirrors/baidu/ERNIE-4.5-21B-A3B-Base-Paddle 百度ERNIE系列再添新成员&#xff0c;210亿参数的ERNIE-4.5-21B-A3B…

作者头像 李华
网站建设 2026/4/16 13:00:22

AMD处理器性能优化终极指南:深度解锁Ryzen隐藏潜能

AMD处理器性能优化终极指南&#xff1a;深度解锁Ryzen隐藏潜能 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gitco…

作者头像 李华
网站建设 2026/4/15 16:52:03

GPX Studio终极指南:5分钟掌握在线GPX文件编辑与可视化分析

GPX Studio终极指南&#xff1a;5分钟掌握在线GPX文件编辑与可视化分析 【免费下载链接】gpxstudio.github.io The online GPX file editor 项目地址: https://gitcode.com/gh_mirrors/gp/gpxstudio.github.io 还在为GPS轨迹文件编辑而头疼吗&#xff1f;GPX Studio作为…

作者头像 李华
网站建设 2026/4/16 12:57:32

互联网大厂Java求职面试实战:Spring Boot、微服务与AI技术栈全解析

互联网大厂Java求职面试实战&#xff1a;Spring Boot、微服务与AI技术栈全解析 本文通过互联网大厂Java求职者谢飞机的面试故事&#xff0c;涵盖核心Java、Spring Boot、微服务架构及AI相关技术&#xff0c;详细讲解面试官的循序渐进提问及答案解析&#xff0c;帮助小白理解复杂…

作者头像 李华
网站建设 2026/4/16 12:58:51

ViGEmBus游戏控制器模拟驱动:从零到精通的完整指南

ViGEmBus游戏控制器模拟驱动&#xff1a;从零到精通的完整指南 【免费下载链接】ViGEmBus 项目地址: https://gitcode.com/gh_mirrors/vig/ViGEmBus ViGEmBus是Windows平台上一款革命性的内核级驱动程序&#xff0c;专门为游戏控制器模拟而生。无论您是想在PC上畅玩主机…

作者头像 李华