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
相关产品推荐
相关产品推荐

