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

