Java 8 Stream findFirst () vs. findAny ()

1. Introduksjon

Java 8 Strøm API introduserte to metoder som ofte blir misforstått: findAny () og findFirst ().

I denne raske opplæringen vil vi se på forskjellen mellom disse to metodene og når de skal brukes.

2. Bruke Stream.findAny ()

Som navnet antyder, er findAny () metoden lar deg finne et hvilket som helst element fra en Strøm. Bruk den når du leter etter et element uten å ta hensyn til møteordren:

Metoden returnerer en Valgfri forekomst som er tom hvis Strøm er tom:

@Test offentlig ugyldig createStream_whenFindAnyResultIsPresent_thenCorrect () {List list = Arrays.asList ("A", "B", "C", "D"); Valgfritt resultat = list.stream (). FindAny (); assertTrue (result.isPresent ()); assertThat (result.get (), anyOf (er ("A"), er ("B"), er ("C"), er ("D"))); }

I en ikke-parallell operasjon, det vil mest sannsynlig returnere det første elementet i Strøm men det er ingen garanti for dette.

For maksimal ytelse ved behandling av parallelloperasjonen kan resultatet ikke bestemmes pålitelig:

@Test public void createParallelStream_whenFindAnyResultIsPresent_thenCorrect () () {List list = Arrays.asList (1, 2, 3, 4, 5); Valgfritt resultat = liste .stream (). Parallell () .filter (num -> num <4) .findAny (); assertTrue (result.isPresent ()); assertThat (result.get (), anyOf (er (1), er (2), er (3))); }

3. Bruke Stream.findFirst ()

De findFirst () metoden finner det første elementet i en Strøm. Åpenbart brukes denne metoden når du spesifikt vil ha det første elementet fra en sekvens.

Når det ikke er møterekkefølge, returnerer det noe element fra Strøm. De java.util.streams pakke dokumentasjon sier:

Strømmer kan ha eller ikke ha en definert møte ordre. Det avhenger av kilden og mellomoperasjonene.

Returtypen er også en Valgfri forekomst som er tom hvis Strøm er også tom:

@Test offentlig ugyldig createStream_whenFindFirstResultIsPresent_thenCorrect () {List list = Arrays.asList ("A", "B", "C", "D"); Valgfritt resultat = list.stream (). FindFirst (); assertTrue (result.isPresent ()); assertThat (result.get (), er ("A")); }

Oppførselen til findFirst metoden endres ikke i det parallelle scenariet. Hvis møteordren eksisterer, vil den alltid oppføre seg deterministisk.

4. Konklusjon

I denne opplæringen så vi på findAny () og findFirst () metoder for Java 8 Streams API. De findAny () metoden returnerer ethvert element fra a Strøm mens findFirst () metoden returnerer det første elementet i a Strøm.

Du kan finne den komplette kildekoden og alle kodebiter for denne artikkelen på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found