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

Java 8 Stream使用reduce()时,过滤后流为空如何返回Null?

问题修复:Stream处理全null列表时返回0而非null的解决方案

原代码片段

BigDecimal output = items.stream()
    .filter(Objects::notnull)
    .reduce(BigDecimal.ZERO, BigDecimal::add);

测试用例

a. 输入 -> List<BigDecimal> items = Arrays.asList(null, 4);
   预期输出:4

b. 输入 -> List<BigDecimal> items = Arrays.asList(null, 4, 3);
   预期输出:7

c. 输入 -> List<BigDecimal> items = Arrays.asList(null, null);
   预期输出:null

问题分析

当前代码在测试用例c中执行失败:过滤后的流为空时,reduce(BigDecimal.ZERO, BigDecimal::add)会直接返回指定的初始值BigDecimal.ZERO,因此实际输出为0,而非预期的null。

修复方案

使用无初始值的reduce方法,它会返回Optional<BigDecimal>,再通过orElse(null)实现空流时返回null的需求。同时注意原代码中Objects::notnull是拼写错误,正确应为Objects::nonNull。

修复后的代码:

BigDecimal output = items.stream()
    .filter(Objects::nonNull)
    .reduce(BigDecimal::add)
    .orElse(null);

逻辑验证

  • 测试用例a:过滤后剩余元素4,reduce返回Optional.of(4),orElse(null)返回4,符合预期
  • 测试用例b:过滤后剩余元素4、3,累加后得到7,返回7,符合预期
  • 测试用例c:过滤后流为空,reduce返回Optional.empty(),orElse(null)返回null,符合预期

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 23:54:04