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



我想查找字符串流是否至少在Set<String>中出现过一次另一个String。我想出了两个解决方案。

性能方面,哪种方法是最佳/推荐的?

1(

return source.stream().filter(this::streamFilter).count() > 0;

2(

return source.stream().anyMatch(this::streamFilter);

下面是流筛选方法:

private boolean streamFilter(String str) {
    return filterKeywords.contains(str.toLowerCase());
}

过滤器关键字: private Set<String> filterKeywords;

还是有比这更好的方法?

你应该使用 anyMatch(this::streamFilter) ,查看下面 anyMatch 方法上的 API(强调我的(,因为它可能无法评估流的所有元素,而count()显然迭代了整个元素流。

返回此流的任何元素是否与提供的元素匹配 谓语。如果不是,则可能无法计算所有元素的谓词 确定结果所必需的。如果流为空,则 返回 false,并且不计算谓词。

关键是一些流方法,如findFirst()anyMatch()findAny()等,执行短路操作,即它们可能无法评估流的所有元素,您可以参考此处以获取更多详细信息。

anyMatch 并不总是执行所有流。这是最好的方法。

最新更新