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
Fluxos de tipo primitivo em Java 8
Um guia rápido e prático para usar o Java 8 Streams com tipos primitivos.
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.
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.