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:

Guide to the Volatile Keyword in Java
Java Program to Describe the Representation of Graph using Adjacency List
Java Program to Implement ConcurrentHashMap API
Java Switch Statement
Using a Custom Spring MVC’s Handler Interceptor to Manage Sessions
Java Program to Implement Hash Tables with Double Hashing
Recommended Package Structure of a Spring Boot Project
Wrapper Classes in Java
Java Program to Implement Hamiltonian Cycle Algorithm
Introduction to Using Thymeleaf in Spring
Java Program to Implement Interpolation Search Algorithm
An Example of Load Balancing with Zuul and Eureka
Introduction to Spliterator in Java
Working With Maps Using Streams
Versioning a REST API
Testing in Spring Boot
Lớp LinkedHashMap trong Java
Sắp xếp trong Java 8
Java Program to do a Breadth First Search/Traversal on a graph non-recursively
Stack Memory and Heap Space in Java
Java Program to Find the Minimum Element of a Rotated Sorted Array using Binary Search approach
Java Stream Filter with Lambda Expression
Java Program to Implement Hash Tables Chaining with Doubly Linked Lists
Java Program to Find Location of a Point Placed in Three Dimensions Using K-D Trees
Java Program to Implement Pollard Rho Algorithm
Service Registration with Eureka
Giới thiệu Json Web Token (JWT)
Làm thế nào tạo instance của một class mà không gọi từ khóa new?
Java Program to Perform Addition Operation Using Bitwise Operators
An Introduction to Java.util.Hashtable Class
Java Program to Implement EnumMap API
Java Program to Generate All Possible Combinations of a Given List of Numbers