Java Stream sum()短路

时间:2018-12-06 20:31:56

标签: java java-stream

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

Mod

问题在于int succNodes = Arrays.stream(children).mapToInt(PRQuadNode::count).sum(); if (succNodes <= bucketingParam) { /* do something */ } 通常会比succNodes大得多。如果我已经找到足够大的金额,那就没有必要继续计数了。如果我知道我将使succNodes <= bucketingParam检查失败,那将是使流提早停止的最佳方法是什么?

注意:在这种情况下,孩子的大小始终为4。

注2:PRQuadNode :: count是一种递归方法,它不是尾递归。

3 个答案:

答案 0 :(得分: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);

返回:

2
3
5

答案 1 :(得分:2)

您不能仅通过使用流来使流管道短路。

一种解决方法(使用副作用)将是:

/std:c++17

这可以完成任务,但不幸的是,它不是线程安全的(怀疑您无论如何都将并行运行它,因为您的源代码将始终包含4个元素)。

当务之急是:

3,2

答案 2 :(得分:1)

一个人不能用stream来做到这一点。但是,如果它大于bucketingParam,则可以过滤掉。 如果其中任何一个已经大于bucketingParam,就没有必要继续。

if (Arrays.stream(children).mapToInt(PRQuadNode::count)
                           .noneMatch(x -> x > bucketingParam)) {
    int succNodes = Arrays.stream(children).mapToInt(PRQuadNode::count).sum();
}