You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Stream返回偶数和的Optional对象?

嘿,这个问题我之前踩过坑!核心痛点就是Stream是单次消费的——一旦你调用了findAny()、count()或者sum()这类终止操作,整个Stream就被“用光”了,后续再对它做任何操作都会直接抛出IllegalStateException。所以不能分开做“判断是否存在偶数”和“求和”这两步,得把它们合并成一次终止操作来完成。

下面给你两种实用的解决方案:

方案一:用reduce直接生成目标Optional

这是最简洁的写法,reduce(Integer::sum)本身就会返回Optional<Integer>:

  • 如果过滤后的Stream里没有偶数(为空),它会返回Optional.empty()
  • 如果有偶数,就返回包含它们总和的Optional

代码示例:

// 假设这是你的随机数Stream
Stream<Integer> randomNumberStream = ...;

Optional<Integer> evenSum = randomNumberStream
    .filter(n -> n % 2 == 0) // 过滤出偶数
    .reduce(Integer::sum);   // 终止操作:求和并返回Optional
方案二:用统计类兼顾更多信息

如果你还需要额外的统计数据(比如偶数的个数、最大值之类的),可以用IntSummaryStatistics:

  1. 先把过滤后的Stream转成IntStream,调用summaryStatistics()一次性获取所有统计信息
  2. 通过统计数据的getCount()判断是否有偶数:
    • 计数为0就返回Optional.empty()
    • 否则返回包含总和的Optional

代码示例:

Stream<Integer> randomNumberStream = ...;

IntSummaryStatistics evenStats = randomNumberStream
    .filter(n -> n % 2 == 0)
    .mapToInt(Integer::intValue)
    .summaryStatistics(); // 终止操作:获取统计数据

Optional<Integer> evenSum = evenStats.getCount() == 0 
    ? Optional.empty() 
    : Optional.of((int) evenStats.getSum());

简单总结下:核心就是避免多次调用终止操作,把“判断存在”和“求和”合并成一次终止操作完成,上面两种方法都完美解决了这个问题~

内容的提问来源于stack exchange,提问作者Pasha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:52:57