Java Top

I just announced the new Learn Spring course, focused on the fundamentals of Spring 5 and Spring Boot 2:


1. Introduction

The Java 8 Stream API introduced two methods that are often being misunderstood: findAny() and findFirst().

In this quick tutorial, we will be looking at the difference between these two methods and when to use them.

Further reading:

Filtering a Stream of Optionals in Java

A quick and practical guide to filtering Streams of Optionals in Java 8 and Java 9

Primitive Type Streams in Java 8

A quick and practical guide to using Java 8 Streams with primitive types.

Iterable to Stream in Java

The article explains how to convert an Iterable to Stream and why the Iterable interface doesn't support it directly.

2. Using the Stream.findAny()

As the name suggests, the findAny() method allows you to find any element from a Stream. Use it when you are looking for an element without paying an attention to the encounter order:

The method returns an Optional instance which is empty if the Stream is empty:

public void createStream_whenFindAnyResultIsPresent_thenCorrect() {
    List<String> list = Arrays.asList("A","B","C","D");

    Optional<String> result =;

    assertThat(result.get(), anyOf(is("A"), is("B"), is("C"), is("D")));

In a non-parallel operation, it will most likely return the first element in the Stream but there is no guarantee for this.

For maximum performance when processing the parallel operation the result cannot be reliably determined:

public void createParallelStream_whenFindAnyResultIsPresent_thenCorrect()() {
    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
    Optional<Integer> result = list
      .filter(num -> num < 4).findAny();

    assertThat(result.get(), anyOf(is(1), is(2), is(3)));

3. Using the Stream.findFirst()

The findFirst() method finds the first element in a Stream. Obviously, this method is used when you specifically want the first element from a sequence.

When there is no encounter order it returns any element from the Stream. The java.util.streams package documentation says:

Streams may or may not have a defined encounter order. It depends on the source and the intermediate operations.

The return type is also an Optional instance which is empty if the Stream is empty too:

public void createStream_whenFindFirstResultIsPresent_thenCorrect() {

    List<String> list = Arrays.asList("A", "B", "C", "D");

    Optional<String> result =;

    assertThat(result.get(), is("A"));

The behavior of the findFirst method does not change in the parallel scenario. If the encounter order exists, it will always behave deterministically.

4. Conclusion

In this tutorial, we looked at the findAny() and findFirst() methods of the Java 8 Streams API. The findAny() method returns any element from a Stream while the findFirst() method returns the first element in a Stream.

You can find the complete source code and all code snippets for this article over on GitHub.

Java bottom

I just announced the new Learn Spring course, focused on the fundamentals of Spring 5 and Spring Boot 2:

Newest Most Voted
Inline Feedbacks
View all comments
3 years ago

Nice and concise. Just how I like it. Thanks

Eugen Paraschiv
3 years ago
Reply to  enyibinakata

That’s exactly what I had in mind when we started to publish these kinds of short and to the point writeups. Glad you liked it.

Comments are closed on this article!