【问题标题】:Is there a way to find the first element to match a Predicate? [duplicate]有没有办法找到第一个匹配谓词的元素? [复制]
【发布时间】:2015-04-22 08:10:45
【问题描述】:

使用 Java 8+,您可以轻松找到集合中与 Predicate 匹配的所有元素。

someCollection.stream().filter(somePredicate)

然后你可以找到第一个元素:

someCollection.stream().filter(somePredicate).findFirst()

不过,问题在于它会针对所有元素运行Predicate。有没有一种干净的方法可以只对元素运行 Predicate 直到找到第一个匹配项,然后返回它,就像 anyMatch 所做的那样(但返回一个 boolean 告诉是否找到一个匹配项)?

【问题讨论】:

  • 是什么让您认为它贯穿了Stream 的所有元素?

标签: java performance filtering predicate java-stream


【解决方案1】:

它完全符合您的要求。它不会遍历所有元素。 filter 方法创建一个流,并在其之上findFirst 创建另一个流。

因此,当您尝试获取在findFirst() 之后创建的流元素时,您将只获得与谓词匹配的第一个元素。

最好的检查方法是在谓词中添加打印行或类似内容。

创建一个整数流,例如从 0 到 10 并创建一个谓词来打印该数字,然后检查它是否被 3 除。您将得到以下打印结果:0、1、2、3 就是这样。

我过去写了一个问题+答案来更详细地解释它是如何工作的:Understanding java 8 stream's filter method

【讨论】:

  • @Pietu1998 - 我编辑了这个问题,它包含一个指向答案+我的问题的链接,可以更好地解释这一点。
猜你喜欢
  • 2012-10-07
  • 2012-01-21
  • 2014-07-04
  • 2016-03-06
  • 2019-07-02
  • 2021-09-24
相关资源
最近更新 更多