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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 05:54:22