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

Java Streams API能否实现LongStream顺序累加满足条件即中断返回?

Java Stream累加提前短路实现方案

我们需要实现Integer/Long类型流的累加短路逻辑:累加过程中每次计算当前和,和固定阈值比较,满足条件时立刻终止累加,不需要遍历全量元素,最终根据累加和是否等于阈值返回1或0。

方案1:JDK9+ 基于takeWhile实现

takeWhile是JDK9新增的短路中间操作,遇到不满足断言的元素就会终止流后续处理,配合可变累加器即可实现需求:

import java.util.stream.LongStream;

public class ShortCircuitAccumulate {
    public static int sumCheck(long target, LongStream numStream) {
        // 用数组作为可变容器绕过lambda局部变量修改限制
        final long[] currentSum = {0};
        numStream.takeWhile(num -> {
            currentSum[0] += num;
            // 累加和小于阈值时继续处理下一个元素,否则停止
            return currentSum[0] < target;
        // 调用count触发流执行,无额外性能开销
        }).count();
        return currentSum[0] == target ? 1 : 0;
    }

    public static void main(String[] args) {
        // 测试用例:固定阈值15,输入流1,2,3,4,5,6
        LongStream testStream = LongStream.of(1,2,3,4,5,6);
        System.out.println(sumCheck(15, testStream)); // 输出结果为1
    }
}

方案2:JDK8及通用版本 基于迭代器实现

如果使用JDK8没有takeWhileAPI,可以直接获取流的迭代器手动控制遍历逻辑,同样支持短路:

import java.util.PrimitiveIterator;
import java.util.stream.LongStream;

public class ShortCircuitAccumulate {
    public static int sumCheck(long target, LongStream numStream) {
        long currentSum = 0;
        PrimitiveIterator.OfLong iterator = numStream.iterator();
        // 累加和未达阈值且还有元素时继续遍历,否则终止
        while (iterator.hasNext() && currentSum < target) {
            currentSum += iterator.next();
        }
        return currentSum == target ? 1 : 0;
    }

    public static void main(String[] args) {
        LongStream testStream = LongStream.of(1,2,3,4,5,6);
        System.out.println(sumCheck(15, testStream)); // 输出结果为1
    }
}

两种方案都不会遍历全量元素,累加和达到阈值就会立刻终止处理,相比全量reduce操作在流元素较多时性能优势更明显。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 10:45:03