Difference between findAny() and findFirst() in Java 8
What I understood is that both will return the first matched element from the stream, for example, when used in conjunction with filter?
That's not true. According to the javadoc, Stream#findAny()
:
Returns an
Optional<T>
describing some element of the stream, or an emptyOptional<T>
if the stream is empty. The behavior of this operation is explicitly nondeterministic; it is free to select any element in the stream. This is to allow for maximal performance in parallel operations;
while Stream.findFirst()
will return an Optional<T>
describing strictly the first element of the stream. The Stream
class doesn't have a .findOne()
method, so I suppose you meant .findFirst()
.
No, both will not return the first element of the Stream.
From Stream.findAny()
(emphasis mine):
Returns an
Optional
describing some element of the stream, or an emptyOptional
if the stream is empty.This is a short-circuiting terminal operation.
The behavior of this operation is explicitly nondeterministic; it is free to select any element in the stream. This is to allow for maximal performance in parallel operations; the cost is that multiple invocations on the same source may not return the same result. (If a stable result is desired, use findFirst()
instead.)
So to put it more simply, it may or may not choose the first element of the Stream.
With the current Oracle-specific implementation, I believe that it will return the first element in a non-parallel pipeline. However, in a parallel pipeline, it won't always, executing for example
System.out.println(IntStream.range(0, 100).parallel().findAny());
it returned OptionalInt[50]
when I ran it. Anyhow, you must not rely on that.