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 Generate All Pairs of Subsets Whose Union Make the Set
Java Program to Implement SynchronosQueue API
Java Program to Decode a Message Encoded Using Playfair Cipher
Java Program to Implement Suffix Array
An Intro to Spring Cloud Task
Java Program to Check Whether an Input Binary Tree is the Sub Tree of the Binary Tree
Java Program to Convert a Decimal Number to Binary Number using Stacks
Spring Cloud AWS – S3
Filtering and Transforming Collections in Guava
Tránh lỗi NullPointerException trong Java như thế nào?
Java Program to Solve the Fractional Knapsack Problem
Java Program to Implement Horner Algorithm
Comparing Arrays in Java
Java Program to Implement Hopcroft Algorithm
Java Program for Douglas-Peucker Algorithm Implementation
Java Program to Find Whether a Path Exists Between 2 Given Nodes
The “final” Keyword in Java
Spring Boot - Google Cloud Platform
Spring Boot - Apache Kafka
Java Program to Implement a Binary Search Tree using Linked Lists
An Intro to Spring Cloud Security
A Guide to WatchService in Java NIO2
Java Program to Implement DelayQueue API
Java Program to Implement Circular Singly Linked List
Loại bỏ các phần tử trùng trong một ArrayList như thế nào?
Removing Elements from Java Collections
Spring Boot Change Context Path
Java Perform to a 2D FFT Inplace Given a Complex 2D Array
Summing Numbers with Java Streams
How to Change the Default Port in Spring Boot
Java Program to Check if it is a Sparse Matrix
Java Program to Find Number of Spanning Trees in a Complete Bipartite Graph