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.