在做项目时,我写了这行,基本上是根据有多少个子节点来决定是否合并当前节点。
Mod
问题在于int succNodes = Arrays.stream(children).mapToInt(PRQuadNode::count).sum();
if (succNodes <= bucketingParam) { /* do something */ }
通常会比succNodes
大得多。如果我已经找到足够大的金额,那就没有必要继续计数了。如果我知道我将使succNodes <= bucketingParam检查失败,那将是使流提早停止的最佳方法是什么?
注意:在这种情况下,孩子的大小始终为4。
注2:PRQuadNode :: count是一种递归方法,它不是尾递归。
答案 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();
}