Java Stream API:使用reduce()操作筛选符合要求的最小值
解决方案
你需要自定义reduce的累加器逻辑,区分“全是-1”和“存在非-1元素”的情况,避免把-1误判为有效最小值。
核心实现代码
// 场景A测试 Stream<Integer> casea = Stream.of(2, 0, 4); int resultA = casea.reduce(-1, (acc, num) -> { if (acc == -1) { // 累积值为-1,说明还未找到非-1元素 return num == -1 ? -1 : num; } else { // 已有非-1累积值,遇到-1直接跳过,否则取更小值 return num == -1 ? acc : Math.min(acc, num); } }); System.out.println(resultA); // 输出0 // 场景B测试 Stream<Integer> caseb = Stream.of(-1, -1, -1); int resultB = caseb.reduce(-1, (acc, num) -> { if (acc == -1) { return num == -1 ? -1 : num; } else { return num == -1 ? acc : Math.min(acc, num); } }); System.out.println(resultB); // 输出-1 // 场景C测试 Stream<Integer> casec = Stream.of(-1, 2, 5); int resultC = casec.reduce(-1, (acc, num) -> { if (acc == -1) { return num == -1 ? -1 : num; } else { return num == -1 ? acc : Math.min(acc, num); } }); System.out.println(resultC); // 输出2
逻辑说明
- 初始值设为
-1,代表“尚未找到任何非-1元素”的初始状态。 - 当累积值为
-1时:- 当前元素也是
-1,则保持累积值为-1; - 当前元素是非-1,直接将该元素作为新的累积值(这是第一个有效元素)。
- 当前元素也是
- 当累积值已经是非-1时:
- 遇到
-1直接保留当前累积值(忽略无效值); - 遇到非-1元素,取累积值与当前元素的较小值,确保得到最小的有效数。
- 遇到
替代方案(非纯reduce实现)
如果不限制必须只用reduce,可以先过滤掉-1再取最小值,最后用orElse处理全是-1的情况:
Stream<Integer> casec = Stream.of(-1, 2, 5); int result = casec.filter(num -> num != -1) .min(Integer::min) .orElse(-1);
内容的提问来源于stack exchange,提问作者PatPanda
相关产品推荐
相关产品推荐

