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:

Hướng dẫn Java Design Pattern – Flyweight
Java Program to Perform Left Rotation on a Binary Search Tree
Java Program to Implement Quick sort
Java Program to Implement Branch and Bound Method to Perform a Combinatorial Search
Java Program to Find Nearest Neighbor for Static Data Set
How to Read HTTP Headers in Spring REST Controllers
Java Program to Implement Maximum Length Chain of Pairs
A Guide to JUnit 5
Java Program to Find Inverse of a Matrix
@DynamicUpdate with Spring Data JPA
Java 8 – Powerful Comparison with Lambdas
Apache Commons Collections MapUtils
Spring Boot - Tomcat Deployment
Java Program to Compute Discrete Fourier Transform Using the Fast Fourier Transform Approach
HttpAsyncClient Tutorial
Java Program to Solve Set Cover Problem assuming at max 2 Elements in a Subset
Jackson Annotation Examples
An Introduction to ThreadLocal in Java
Java Program to Check whether Graph is Biconnected
Java Program to find the maximum subarray sum using Binary Search approach
The DAO with JPA and Spring
Spring Cloud AWS – S3
Java Program to Find Whether a Path Exists Between 2 Given Nodes
Java Program to Implement Shoelace Algorithm
Exploring the Spring Boot TestRestTemplate
Sao chép các phần tử của một mảng sang mảng khác như thế nào?
Check If Two Lists are Equal in Java
Tránh lỗi ConcurrentModificationException trong Java như thế nào?
Spring Boot - Scheduling
Java Program to Implement Strassen Algorithm
Java Program to Perform Cryptography Using Transposition Technique
Collection trong java