【问题标题】:Java Streams: filter().count() vs anyMatch()Java 流:filter().count() 与 anyMatch()
【发布时间】:2017-09-04 21:21:51
【问题描述】:

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

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

1)

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

2)

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

这里是streamFilter方法:

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

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

或者还有比这更好的方法吗?

【问题讨论】:

标签: java java-8 java-stream


【解决方案1】:

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

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

重点是一些流方法,如findFirst()anyMatch()findAny() 等。执行短路操作,即它们可能不会评估流的所有元素您可以参考here了解更多详情。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-07
      • 1970-01-01
      • 1970-01-01
      • 2018-04-11
      • 2019-11-30
      • 2016-10-26
      • 2016-08-08
      相关资源
      最近更新 更多