Stream Java 8 Stream findFirst () vs. findAny ()

1. Úvod

Java 8 Prúd API predstavilo dve metódy, ktoré sa často nesprávne chápu: findAny () a findFirst ().

V tomto rýchlom návode sa pozrieme na rozdiel medzi týmito dvoma metódami a na to, kedy ich použiť.

2. Pomocou Stream.findAny ()

Ako už názov napovedá, findAny () metóda umožňuje nájsť akýkoľvek prvok z a Prúd. Použite ho, keď hľadáte prvok bez toho, aby ste venovali pozornosť poradiu stretnutia:

Metóda vráti znak Voliteľné inštancia, ktorá je prázdna, ak Prúd je prázdny:

@Test public void createStream_whenFindAnyResultIsPresent_thenCorrect () {List list = Arrays.asList ("A", "B", "C", "D"); Voliteľný výsledok = list.stream (). FindAny (); assertTrue (result.isPresent ()); assertThat (result.get (), anyOf (is ("A"), is ("B"), is ("C"), is ("D"))); }

V neparalelnej prevádzke s najväčšou pravdepodobnosťou vráti prvý prvok v Prúd ale za to neexistuje žiadna záruka.

Pre maximálny výkon pri spracovaní paralelnej operácie nie je možné spoľahlivo určiť výsledok:

@Test public void createParallelStream_whenFindAnyResultIsPresent_thenCorrect () () {List list = Arrays.asList (1, 2, 3, 4, 5); Voliteľný výsledok = zoznam .stream (). Parallel () .filter (num -> num <4) .findAny (); assertTrue (result.isPresent ()); assertThat (result.get (), anyOf (je (1), je (2), je (3))); }

3. Pomocou Stream.findFirst ()

The findFirst () metóda vyhľadá prvý prvok v a Prúd. Je zrejmé, že táto metóda sa používa, keď konkrétne požadujete prvý prvok zo sekvencie.

Ak neexistuje objednávka stretnutia, vráti akýkoľvek prvok z Prúd. The java.util.streams dokumentácia k balíku hovorí:

Prúdy môžu, ale nemusia mať definované poradie stretnutia. Závisí to od zdroja a sprostredkujúcich operácií.

Návratový typ je tiež Voliteľné inštancia, ktorá je prázdna, ak Prúd je tiež prázdny:

@Test public void createStream_whenFindFirstResultIsPresent_thenCorrect () {List list = Arrays.asList ("A", "B", "C", "D"); Voliteľný výsledok = list.stream (). FindFirst (); assertTrue (result.isPresent ()); assertThat (result.get (), je ("A")); }

Správanie findFirst metóda sa v paralelnom scenári nezmení. Ak príkaz na stretnutie existuje, bude sa vždy správať deterministicky.

4. Záver

V tomto návode sme sa pozreli na findAny () a findFirst () metódy rozhrania API Java 8 Streams. The findAny () metóda vráti akýkoľvek prvok z a Prúd kým findFirst () metóda vráti prvý prvok v a Prúd.

Kompletný zdrojový kód a všetky útržky kódu pre tento článok nájdete na GitHub.


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