Java 8 Stream findFirst () vs findAny ()

1. Introduzione

L' API Java 8 Stream ha introdotto due metodi che spesso vengono fraintesi: findAny () e findFirst () .

In questo breve tutorial, esamineremo la differenza tra questi due metodi e quando utilizzarli.

2. Utilizzo di Stream.findAny ()

Come suggerisce il nome, il metodo findAny () ti consente di trovare qualsiasi elemento da un flusso . Usalo quando cerchi un elemento senza prestare attenzione all'ordine di incontro:

Il metodo restituisce un'istanza opzionale che è vuota se lo Stream è vuoto:

@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"))); }

In un'operazione non parallela, molto probabilmente restituirà il primo elemento nel flusso ma non vi è alcuna garanzia per questo .

Per le massime prestazioni durante l'elaborazione dell'operazione parallela, il risultato non può essere determinato in modo affidabile:

@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. Utilizzo di Stream.findFirst ()

Il metodo findFirst () trova il primo elemento in un flusso. Ovviamente, questo metodo viene utilizzato quando si desidera specificamente il primo elemento di una sequenza.

Quando non esiste un ordine di incontro, restituisce qualsiasi elemento dallo Stream . La documentazione del pacchetto java.util.streams dice:

I flussi possono avere o meno un ordine di incontro definito . Dipende dalla fonte e dalle operazioni intermedie.

Il tipo restituito è anche un'istanza opzionale che è vuota se anche lo Stream è vuoto:

@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")); }

Il comportamento del metodo findFirst non cambia nello scenario parallelo. Se l'ordine di incontro esiste, si comporterà sempre in modo deterministico.

4. Conclusione

In questo tutorial, abbiamo esaminato i metodi findAny () e findFirst () dell'API Java 8 Streams. Il metodo findAny () restituisce qualsiasi elemento da uno Stream mentre il metodo findFirst () restituisce il primo elemento in uno Stream .

Puoi trovare il codice sorgente completo e tutti i frammenti di codice per questo articolo su GitHub.