Java 8 Stream findFirst () vs. encontre algum()

Java 8 Stream findFirst () vs. encontre algum()

1. Introdução

A API Java 8Stream introduziu dois métodos que muitas vezes estão sendo mal compreendidos:findAny()efindFirst().

Neste tutorial rápido, veremos a diferença entre esses dois métodos e quando usá-los.

Leitura adicional:

Filtrando um fluxo de opcionais em Java

Um guia rápido e prático para filtrar fluxos de opcionais em Java 8 e Java 9

Read more

Fluxos de tipo primitivo em Java 8

Um guia rápido e prático para usar o Java 8 Streams com tipos primitivos.

Read more

Iterável para transmitir em Java

O artigo explica como converter um Iterable em Stream e por que a interface Iterable não oferece suporte direto.

Read more

2. Usando oStream.findAny()

Como o nome sugere, o métodofindAny() permite que você encontre qualquer elemento de umStream. Use-o quando estiver procurando por um elemento sem prestar atenção à ordem do encontro:

O método retorna uma instânciaOptional que está vazia seStream estiver vazia:

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

    Optional result = list.stream().findAny();

    assertTrue(result.isPresent());
    assertThat(result.get(), anyOf(is("A"), is("B"), is("C"), is("D")));
}

Em uma operação não paralela,it will most likely return the first element in the Stream but there is no guarantee for this.

Para obter desempenho máximo ao processar a operação paralela, o resultado não pode ser determinado com segurança:

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

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

3. Usando oStream.findFirst()

O métodofindFirst() encontra o primeiro elemento em aStream. Obviamente, esse método é usado quando você deseja especificamente o primeiro elemento de uma sequência.

Quando não há ordem de encontro, ele retorna qualquer elemento deStream. A documentação do pacotejava.util.streams diz:

Os fluxos podem ou não ter umencounter order definido. Depende da fonte e das operações intermediárias.

O tipo de retorno também é uma instânciaOptional que estará vazia seStream também estiver vazia:

@Test
public void createStream_whenFindFirstResultIsPresent_thenCorrect() {

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

    Optional result = list.stream().findFirst();

    assertTrue(result.isPresent());
    assertThat(result.get(), is("A"));
}

O comportamento do métodofindFirst não muda no cenário paralelo. Se a ordem de encontro existir, ela sempre se comportará deterministicamente.

4. Conclusão

Neste tutorial, vimos os métodosfindAny()efindFirst() da API Java 8 Streams. O métodofindAny() retorna qualquer elemento deStream, enquanto o métodofindFirst() retorna o primeiro elemento emStream.

Você pode encontrar o código-fonte completo e todos os trechos de código deste artigoover on GitHub.