Java Stream sum()短路

Chr*_*ris 7 java java-stream

在做一个项目时,我写了这一行,基本上它决定了是否根据有多少孩子合并当前节点.

int succNodes = Arrays.stream(children).mapToInt(PRQuadNode::count).sum();
if (succNodes <= bucketingParam) { /* do something */ }
Run Code Online (Sandbox Code Playgroud)

问题是succNodes通常会明显大于bucketingParam.如果我已经找到了足够大的金额,那就没有必要继续计算了.如果我知道我将失败检查succNodes <= bucketingParam,那么启用流提前停止的最佳方法是什么?

注意:在这种情况下,孩子的总是4.

注2:PRQuadNode :: count是一个递归方法,它不是尾递归的.

MC *_*ror 6

实际上,Java 9附带了该takeWhile方法,该方法是流的短路操作,返回与给定谓词匹配的元素的最长前缀.

因为谓词取决于前面元素的总和,所以必须使用包装器来存储中间结果.在下面的示例中,我使用了AtomicInteger类:

AtomicInteger sum = new AtomicInteger();
Arrays.asList(2, 3, 5, 7, 11, 13, 17).stream()
    .takeWhile(i -> sum.addAndGet(i) < 15)
    .forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

返回:

2
3
5
Run Code Online (Sandbox Code Playgroud)