在做一个项目时,我写了这一行,基本上它决定了是否根据有多少孩子合并当前节点.
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是一个递归方法,它不是尾递归的.
实际上,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)
| 归档时间: |
|
| 查看次数: |
128 次 |
| 最近记录: |