Java 8 Stream findFirst () vs. findAny ()

1. Introduktion

Java 8 Strøm API introducerede to metoder, der ofte misforstås: findAny () og findFirst ().

I denne hurtige vejledning vil vi se på forskellen mellem disse to metoder og hvornår de skal bruges.

2. Brug af Stream.findAny ()

Som navnet antyder, er findAny () metode giver dig mulighed for at finde ethvert element fra en Strøm. Brug det, når du leder efter et element uden at være opmærksom på møderækkefølgen:

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

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

I en ikke-parallel operation, det vil sandsynligvis returnere det første element i Strøm men der er ingen garanti for dette.

For at opnå maksimal ydelse ved behandling af den parallelle operation kan resultatet ikke bestemmes pålideligt:

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

3. Brug af Stream.findFirst ()

Det findFirst () metoden finder det første element i en Strøm. Det er klart, at denne metode bruges, når du specifikt vil have det første element fra en sekvens.

Når der ikke er nogen møderækkefølge, returnerer det noget element fra Strøm. Det java.util.streams pakke dokumentation siger:

Streams kan eller ikke har en defineret møde rækkefølge. Det afhænger af kilden og de mellemliggende operationer.

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

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

Opførelsen af findFirst metoden ændres ikke i parallelscenariet. Hvis møderækkefølgen findes, vil den altid opføre sig deterministisk.

4. Konklusion

I denne vejledning så vi på findAny () og findFirst () metoder til Java 8 Streams API. Det findAny () metoden returnerer ethvert element fra en Strøm mens findFirst () metoden returnerer det første element i en Strøm.

Du kan finde den komplette kildekode og alle kodestykker til denne artikel på GitHub.