Java 8 Stream findFirst () vs. findAny ()

1. Inleiding

De Java 8 Stroom API introduceerde twee methoden die vaak verkeerd worden begrepen: findAny () en findFirst ().

In deze korte tutorial kijken we naar het verschil tussen deze twee methoden en wanneer we ze moeten gebruiken.

2. Gebruik de Stream.findAny ()

Zoals de naam doet vermoeden, is de findAny () methode kunt u elk element van een Stroom. Gebruik het wanneer u op zoek bent naar een element zonder op de volgorde van ontmoeting te letten:

De methode retourneert een Optioneel instantie die leeg is als de Stroom is leeg:

@Test openbare ongeldige createStream_whenFindAnyResultIsPresent_thenCorrect () {List list = Arrays.asList ("A", "B", "C", "D"); Optioneel resultaat = list.stream (). FindAny (); assertTrue (result.isPresent ()); assertThat (result.get (), anyOf (is ("A"), is ("B"), is ("C"), is ("D"))); }

In een niet-parallelle werking, het zal hoogstwaarschijnlijk het eerste element in de Stroom maar hiervoor is geen garantie.

Voor maximale prestaties bij het verwerken van de parallelle werking kan het resultaat niet betrouwbaar worden bepaald:

@Test openbare ongeldige createParallelStream_whenFindAnyResultIsPresent_thenCorrect () () {Lijstlijst = Arrays.asList (1, 2, 3, 4, 5); Optioneel resultaat = lijst .stream (). Parallel () .filter (num -> num <4) .findAny (); assertTrue (result.isPresent ()); assertThat (result.get (), anyOf (is (1), is (2), is (3))); }

3. Gebruik de Stream.findFirst ()

De findFirst () methode vindt het eerste element in een Stroom. Het is duidelijk dat deze methode wordt gebruikt wanneer u specifiek het eerste element uit een reeks wilt.

Als er geen ontmoetingsvolgorde is, retourneert het elk element uit de Stroom. De java.util.streams pakket documentatie zegt:

Streams kunnen al dan niet een gedefinieerd tegenkomen orde. Het hangt af van de bron en de tussenliggende bewerkingen.

Het retourtype is ook een Optioneel instantie die leeg is als de Stroom is ook leeg:

@Test openbare ongeldige createStream_whenFindFirstResultIsPresent_thenCorrect () {List list = Arrays.asList ("A", "B", "C", "D"); Optioneel resultaat = lijst.stream (). FindFirst (); assertTrue (result.isPresent ()); assertThat (result.get (), is ("A")); }

Het gedrag van de findFirst methode verandert niet in het parallelle scenario. Als de ontmoetingsvolgorde bestaat, zal deze zich altijd deterministisch gedragen.

4. Conclusie

In deze tutorial hebben we gekeken naar de findAny () en findFirst () methoden van de Java 8 Streams API. De findAny () methode retourneert elk element van een Stroom Terwijl de findFirst () methode retourneert het eerste element in een Stroom.

Je kunt de volledige broncode en alle codefragmenten voor dit artikel vinden op GitHub.