根据以前的计算结果停止java流计算

VB_*_*VB_ 8 java java-8 java-stream

如何根据以前的结果打破流计算?如果很明显stream.filter(...).count()会小于某个数字 - 如何停止流计算?

我有以下代码检查是否有人sampleData通过了predicate测试:

// sampleData.size() may be greater than 10.000.000
Set<String> sampleData = downloadFromWeb(); 
return sampleData.stream().filter(predicate::test).count() > sampleData.size() * coefficient;
Run Code Online (Sandbox Code Playgroud)

我可以有成千上万的sampleData.问题是这段代码无效.例如,如果coefficientequals 0.5,sampleData.size() = 10_000_000和第一个5_000_000元素失败predicate::test- 没有理由验证最后的5_000_000元素(count()永远不会大于5_000_000).

Hol*_*ger 4

ZhekaKozlov\xe2\x80\x99s 的答案正朝着正确的方向发展,但缺乏否定。为了使匹配大于某个阈值,非匹配元素的数量必须小于 \xe2\x80\x9csize - 阈值\xe2\x80\x9d。如果我们测试不匹配的元素是否较小,我们可以limit在它们变大时应用 a 来停止:

\n\n
Set<String> sampleData = downloadFromWeb();\nfinal long threshold = sampleData.size()-(long)(sampleData.size() * coefficient);\nreturn sampleData.stream()\n                 .filter(predicate.negate()).limit(threshold+1).count() < threshold;\n
Run Code Online (Sandbox Code Playgroud)\n\n

顺便说一句,没有理由创建对现有测试方法(Predicate如 with )的方法引用predicate::test。只需将 传递Predicate给该filter方法即可。上面的代码也使用\xe2\x80\xa6predicate.negate()代替predicate.negate()::test

\n