Java Streams:filter().count()vs anyMatch()

daz*_*ito 11 java java-8 java-stream

我想找出一个字符串流是否至少有一个出现在另一个字符串StringSet<String>.我想出了两个解决方案.

性能方面,哪种方法最好/推荐?

1)

return source.stream().filter(this::streamFilter).count() > 0;
Run Code Online (Sandbox Code Playgroud)

2)

return source.stream().anyMatch(this::streamFilter);
Run Code Online (Sandbox Code Playgroud)

这是streamFilter方法:

private boolean streamFilter(String str) {
    return filterKeywords.contains(str.toLowerCase());
}
Run Code Online (Sandbox Code Playgroud)

filterKeywords: private Set<String> filterKeywords;

或者有更好的方法吗?

dev*_*per 21

您应该使用anyMatch(this::streamFilter),看看APIanyMatch下方(重点煤矿)方法,它可能无法评估所有的元素,其中作为流的count()明显迭代元素的全码流.

返回此流的任何元素是否与提供的谓词匹配.如果不是确定结果所必需的,则不能评估所有元素的谓词.如果流为空,则返回false并且不评估谓词.

问题的关键是一些流方法,如findFirst(),anyMatch(),findAny(),等进行短路操作,即,它们可能无法评估流中的所有元素,你可以参考这里了解更多详情.