Java 8 Stream findFirst () vs. findAny ()

1. Einleitung

Die Java 8 Stream- API führte zwei Methoden ein, die häufig missverstanden werden: findAny () und findFirst () .

In diesem kurzen Tutorial werden wir den Unterschied zwischen diesen beiden Methoden und den Zeitpunkt ihrer Verwendung untersuchen.

2. Verwenden von Stream.findAny ()

Wie der Name schon sagt, können Sie mit der findAny () -Methode jedes Element aus einem Stream finden . Verwenden Sie es, wenn Sie nach einem Element suchen, ohne auf die Reihenfolge der Begegnung zu achten:

Die Methode gibt eine optionale Instanz zurück, die leer ist, wenn der Stream leer ist:

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

Bei einer nicht parallelen Operation wird höchstwahrscheinlich das erste Element im Stream zurückgegeben , es gibt jedoch keine Garantie dafür .

Für maximale Leistung bei der Verarbeitung des Parallelbetriebs kann das Ergebnis nicht zuverlässig bestimmt werden:

@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. Verwenden von Stream.findFirst ()

Die findFirst () -Methode findet das erste Element in einem Stream. Offensichtlich wird diese Methode verwendet, wenn Sie speziell das erste Element aus einer Sequenz möchten.

Wenn keine Begegnungsreihenfolge vorhanden ist, wird ein Element aus dem Stream zurückgegeben . In der Paketdokumentation zu java.util.streams heißt es:

Streams können eine definierte Begegnungsreihenfolge haben oder nicht . Dies hängt von der Quelle und den Zwischenoperationen ab.

Der Rückgabetyp ist auch eine optionale Instanz, die leer ist, wenn der Stream ebenfalls leer ist:

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

Das Verhalten der findFirst- Methode ändert sich im parallelen Szenario nicht. Wenn die Begegnungsreihenfolge vorhanden ist, verhält sie sich immer deterministisch.

4. Fazit

In diesem Tutorial haben wir uns die Methoden findAny () und findFirst () der Java 8 Streams-API angesehen. Die findAny () -Methode gibt jedes Element aus einem Stream zurück, während die findFirst () -Methode das erste Element in einem Stream zurückgibt .

Den vollständigen Quellcode und alle Codefragmente für diesen Artikel finden Sie auf GitHub.