Java 8 Stream findFirst() vs. findAny()

1. Overview

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

In this quick tutorial, we’ll look at the difference between these two methods and when to use them.

2. Using Stream.findAny()

As the name suggests, the findAny() method allows us to find any element from a Stream. We use it when we’re 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:

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

    Optional<String> result = list.stream().findAny();

    assertTrue(result.isPresent());
    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:

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

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

3. Using Stream.findFirst()

The findFirst() method finds the first element in a Stream. So, we use this method when we specifically want the first element from a sequence.

When there is no encounter order, it returns any element from the Stream. According to the java.util.streams package documentation, “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:

@Test
public void createStream_whenFindFirstResultIsPresent_thenCorrect() {

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

    Optional<String> result = list.stream().findFirst();

    assertTrue(result.isPresent());
    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 article, 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.

The complete source code and all code snippets for this article are over on GitHub.

Related posts:

Getting the Size of an Iterable in Java
Java Program to Perform String Matching Using String Library
HttpClient 4 – Follow Redirects for POST
Dockerizing a Spring Boot Application
Spring Boot - Hystrix
The Order of Tests in JUnit
Guide to the Synchronized Keyword in Java
Java Program to Implement SynchronosQueue API
Convert String to int or Integer in Java
Hướng dẫn Java Design Pattern – DAO
Java Program to Create a Minimal Set of All Edges Whose Addition will Convert it to a Strongly Conne...
Apache Commons Collections OrderedMap
Sao chép các phần tử của một mảng sang mảng khác như thế nào?
Default Password Encoder in Spring Security 5
Guide to the Java TransferQueue
Write/Read cookies using HTTP and Read a file from the internet
Java Program to Check whether Undirected Graph is Connected using BFS
Receive email using IMAP
Getting Started with Stream Processing with Spring Cloud Data Flow
Converting String to Stream of chars
Java Program to Perform Encoding of a Message Using Matrix Multiplication
Apache Commons Collections BidiMap
Java Program to Repeatedly Search the Same Text (such as Bible by building a Data Structure)
Spring Webflux with Kotlin
Spring Data – CrudRepository save() Method
Java Program to Implement Hash Tables with Linear Probing
Spring MVC Tutorial
Introduction to the Java ArrayDeque
Java Program to implement Bit Matrix
Java Program to Check if a Point d lies Inside or Outside a Circle Defined by Points a, b, c in a Pl...
Java Program to Find a Good Feedback Vertex Set
Spring Boot - Enabling Swagger2