Java 8 Stream findFirst () vs. findAny ()

1. Bemutatkozás

A Java 8 Folyam Az API két módszert vezetett be, amelyeket gyakran félreértenek: findAny () és findFirst ().

Ebben a gyors bemutatóban megvizsgáljuk a két módszer közötti különbséget és azt, hogy mikor kell használni őket.

2. A Stream.findAny ()

Ahogy a neve is mutatja, a findAny () metódus lehetővé teszi, hogy az a bármely elemét megtalálja Folyam. Használja, ha elemet keres, anélkül, hogy figyelne a találkozási sorrendre:

A módszer egy Választható amely üres, ha a Folyam üres:

@Test public void createStream_whenFindAnyResultIsPresent_thenCorrect () {List list = Arrays.asList ("A", "B", "C", "D"); Választható eredmény = list.stream (). FindAny (); assertTrue (result.isPresent ()); assertThat (result.get (), anyOf (is ("A"), is ("B"), is ("C", is ("D"))); }

Nem párhuzamos művelet során nagy valószínűséggel az első elemet adja vissza Folyam de erre nincs garancia.

A párhuzamos művelet feldolgozása során a maximális teljesítmény érdekében az eredmény nem határozható meg megbízhatóan:

@Test public void createParallelStream_whenFindAnyResultIsPresent_thenCorrect () () {List list = Arrays.asList (1, 2, 3, 4, 5); Választható eredmény = list .stream (). Parallel () .filter (num -> num <4) .findAny (); assertTrue (result.isPresent ()); assertThat (result.get (), anyOf (is (1), is (2), is (3))); }

3. A Stream.findFirst ()

A findFirst () módszer megtalálja az első elemet a Folyam. Nyilvánvaló, hogy ezt a módszert akkor alkalmazzák, amikor kifejezetten egy sorozat első elemét szeretné.

Ha nincs találkozási sorrend, bármely elemet ad vissza a Folyam. A java.util.streams a csomag dokumentációja a következőket mondja:

Az adatfolyamoknak lehet, hogy nincs meghatározva találkozási rend. Ez a forrástól és a közbenső műveletektől függ.

A visszatérési típus szintén egy Választható amely üres, ha a Folyam üres is:

@Test public void createStream_whenFindFirstResultIsPresent_thenCorrect () {List list = Arrays.asList ("A", "B", "C", "D"); Választható eredmény = list.stream (). FindFirst (); assertTrue (result.isPresent ()); assertThat (eredmény.get (), az ("A")); }

A. Viselkedése findFirst módszer nem változik a párhuzamos forgatókönyvben. Ha a találkozási sorrend létezik, az mindig determinisztikusan fog viselkedni.

4. Következtetés

Ebben az oktatóanyagban megnéztük a findAny () és findFirst () a Java 8 Streams API metódusai. A findAny () metódus bármely elemet ad vissza az a-ból Folyam amíg a findFirst () metódus az a első elemét adja vissza Folyam.

A cikk teljes forráskódját és összes kódrészletét a GitHubon találja meg.