有没有办法找到匹配谓词的第一个元素?

Pur*_*ari 1 java performance filtering predicate java-stream

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

someCollection.stream().filter(somePredicate)
Run Code Online (Sandbox Code Playgroud)

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

someCollection.stream().filter(somePredicate).findFirst()
Run Code Online (Sandbox Code Playgroud)

但问题是,它会Predicate针对所有元素运行.有没有一种干净的方法只能运行Predicate反对元素,直到找到第一个匹配,然后返回它,就像它一样anyMatch(但返回一个boolean告知是否找到一个)?

Avi*_*Avi 6

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

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

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

创建一个整数流,例如从0到10,并创建一个打印数字的谓词,然后检查它是否除以3.你将打印出来:0,1,2,3就是这样.

我在过去写过一个问题+答案,详细解释它是如何工作的:理解java 8 stream的过滤方法