Java 8 Stream findFirst () vs. findAny ()

Java 8 Stream findFirst () vs. finde irgendein()

1. Einführung

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

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

Weitere Lektüre:

Filtern eines Streams von Optionen in Java

Eine schnelle und praktische Anleitung zum Filtern von Optionsdatenströmen in Java 8 und Java 9

Read more

Grundtyp-Streams in Java 8

Eine schnelle und praktische Anleitung zur Verwendung von Java 8-Streams mit primitiven Typen.

Read more

Iterierbar zum Streaming in Java

In diesem Artikel wird erläutert, wie ein Iterable in Stream konvertiert wird und warum die Iterable-Oberfläche dies nicht direkt unterstützt.

Read more

2. Verwenden SieStream.findAny()

Wie der Name schon sagt, können Sie mit der MethodefindAny() jedes Element ausStream finden. Verwenden Sie diese Option, wenn Sie nach einem Element suchen, ohne auf die Reihenfolge der Begegnungen zu achten:

Die Methode gibt eineOptional-Instanz zurück, die leer ist, wennStream 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 werdenit will most likely return the first element in the Stream but there is no guarantee for this.

Für maximale Leistung bei der Abarbeitung des Parallelbetriebs kann das Ergebnis nicht zuverlässig ermittelt 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 SieStream.findFirst()

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

Wenn keine Begegnungsreihenfolge vorhanden ist, wird ein Element ausStream zurückgegeben. In der Paketdokumentation vonjava.util.streamsheißt es:

Streams können definierteencounter order haben oder nicht. Dies hängt von der Quelle und den Zwischenoperationen ab.

Der Rückgabetyp ist auch eineOptional-Instanz, die leer ist, wenn auchStream 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 MethodefindFirstä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 MethodenfindAny() undfindFirst() der Java 8 Streams-API angesehen. Die MethodefindAny() gibt ein Element vonStream zurück, während die MethodefindFirst() das erste Element inStream zurückgibt.

Sie finden den vollständigen Quellcode und alle Codefragmente für diesen Artikelover on GitHub.