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:

Java Program to Check if any Graph is Possible to be Constructed for a Given Degree Sequence
Extract network card address
Java Program to Implement AttributeList API
Java Program to Implement Borwein Algorithm
Spring Data Java 8 Support
Java Program to Perform Inorder Recursive Traversal of a Given Binary Tree
Giới thiệu Google Guice – Dependency injection (DI) framework
Java Program to Implement Binomial Tree
Java Program to Implement Network Flow Problem
Java Program to Sort an Array of 10 Elements Using Heap Sort Algorithm
Collect a Java Stream to an Immutable Collection
A Quick Guide to Spring Cloud Consul
Generating Random Numbers in a Range in Java
Java Program to Implement Adjacency List
Java Program to Compute Determinant of a Matrix
Checking for Empty or Blank Strings in Java
Introduction to Using Thymeleaf in Spring
Java Program to Generate Random Numbers Using Middle Square Method
Lập trình đa luồng với CompletableFuture trong Java 8
Spring Cloud – Bootstrapping
Remove All Occurrences of a Specific Value from a List
Java Program to Optimize Wire Length in Electrical Circuit
Java Program to Implement Stack using Two Queues
Toán tử instanceof trong java
Java Program to Solve TSP Using Minimum Spanning Trees
Java Program to Find Path Between Two Nodes in a Graph
Java Program to Implement Sorted Doubly Linked List
Hướng dẫn Java Design Pattern – Bridge
Java Program to Implement Brent Cycle Algorithm
Java Program to implement Priority Queue
Java Program to Implement JobStateReasons API
New Features in Java 13