Java 8 Stream findFirst () nasuprot findAny ()

1. Uvod

Java 8 Stream API je predstavio dvije metode koje se često pogrešno razumiju: findAny () i findFirst ().

U ovom ćemo brzom vodiču pogledati razliku između ove dvije metode i kada ih koristiti.

2. Korištenje Stream.findAny ()

Kao što i samo ime govori, findAny () metoda omogućuje vam pronalaženje bilo kojeg elementa iz a Stream. Koristite ga kada tražite element bez obraćanja pažnje na redoslijed susreta:

Metoda vraća Neobvezno instanca koja je prazna ako je Stream prazno je:

@Test javna praznina createStream_whenFindAnyResultIsPresent_thenCorrect () {Lista popisa = Arrays.asList ("A", "B", "C", "D"); Izborni rezultat = list.stream (). FindAny (); assertTrue (result.isPresent ()); assertThat (result.get (), anyOf (is ("A"), is ("B"), is ("C"), is ("D"))); }

U neparalelnoj operaciji, najvjerojatnije će vratiti prvi element u Stream ali za to nema jamstva.

Za maksimalne performanse pri obradi paralelne operacije rezultat se ne može pouzdano utvrditi:

@Test javna praznina createParallelStream_whenFindAnyResultIsPresent_thenCorrect () () {Lista popisa = Arrays.asList (1, 2, 3, 4, 5); Izborni rezultat = popis .stream (). Paralelni () .filter (num -> num <4) .findAny (); assertTrue (result.isPresent ()); assertThat (result.get (), anyOf (je (1), je (2), je (3))); }

3. Korištenje Stream.findFirst ()

The findFirst () metoda pronalazi prvi element u a Potok. Očito se ova metoda koristi kada izričito želite prvi element iz niza.

Kada ne postoji redoslijed susreta, vraća bilo koji element iz datoteke Stream. The java.util.struja dokumentacija paketa kaže:

Potoci mogu ili ne moraju imati definiranu susret susret. Ovisi o izvoru i posrednim operacijama.

Tip povrata je također Neobvezno instanca koja je prazna ako je Stream je i prazno:

@Test javna praznina createStream_whenFindFirstResultIsPresent_thenCorrect () {Lista popisa = Arrays.asList ("A", "B", "C", "D"); Izborni rezultat = list.stream (). FindFirst (); assertTrue (result.isPresent ()); assertThat (result.get (), je ("A")); }

Ponašanje findFirst metoda se ne mijenja u paralelnom scenariju. Ako redoslijed susreta postoji, uvijek će se ponašati deterministički.

4. Zaključak

U ovom vodiču pogledali smo findAny () i findFirst () metode Java 8 Streams API. The findAny () metoda vraća bilo koji element iz a Stream dok findFirst () metoda vraća prvi element u a Stream.

Kompletni izvorni kod i sve isječke koda za ovaj članak možete pronaći na GitHubu.