Potoci primitivnog tipa u Javi 8

1. Uvod

Stream API bio je jedna od ključnih značajki dodanih u Javi 8.

Ukratko, API nam omogućuje obradu zbirki i drugih sekvenci elemenata - prikladno i učinkovitije - pružajući deklarativni API.

2. Primitivni tokovi

Potoci prije svega rade s zbirkama objekata, a ne s primitivnim vrstama.

Srećom, pružiti način rada s tri najčešće korištena primitivna tipa - int, dugo i dvostruko - standardna knjižnica uključuje tri primitivno-specijalizirane implementacije: IntStream, LongStream, i DoubleStream.

Primitivni streamovi ograničeni su uglavnom zbog režije boksa i zato što stvaranje specijaliziranih streamova za druge primitive u mnogim slučajevima nije toliko korisno.

3. Aritmetičke operacije

Počnimo s nekoliko zanimljivih metoda za jako korištene aritmetičke operacije kao što su min, maks, iznos, i prosjek:

int [] cijeli brojevi = novi int [] {20, 98, 12, 7, 35}; int min = Nizovi.stream (cijeli brojevi) .min () .getAsInt (); // vraća 7

Krenimo sada kroz isječak koda gore da bismo razumjeli što se događa.

Stvorili smo svoje IntStream pomoću java.util.Arrays.stream (int []) a zatim upotrijebio min () metoda da se dobije najmanji cijeli broj kao java.util.O optionalInt i na kraju nazvao getAsInt () da biste dobili int vrijednost.

Drugi način za stvaranje IntStream koristi IntStream.of (int…). The maks. () metoda će vratiti najveći cijeli broj:

int max = IntStream.of (20, 98, 12, 7, 35) .max () .getAsInt (); // vraća 98

Dalje - da bismo dobili zbroj cijelih brojeva koje samo nazivamo iznos() metodu i ne trebamo koristiti getAsInt () budući da već vraća rezultat kao int vrijednost:

int sum = IntStream.of (20, 98, 12, 7, 35) .sum (); // vraća 172

Pozivamo se na prosjek () metodu za dobivanje prosjeka cjelobrojnih vrijednosti i kao što vidimo, trebali bismo koristiti getAsDouble () jer vraća vrijednost tipa dvostruko.

dvostruko prosječno = IntStream.of (20, 98, 12, 7, 35) .average () .getAsDouble (); // vraća 34.4

4. Domet

Također možemo stvoriti IntStream na temelju raspona:

int sum = IntStream.range (1, 10) .sum (); // vraća 45 int sum = IntStream.rangeClosed (1, 10) .sum (); // vraća 55

Kao što gornji isječak koda pokazuje, postoje dva načina za stvaranje raspona cjelobrojnih vrijednosti raspon () i rangeClosed ().

Razlika je u tome što je kraj raspon () je ekskluzivan dok uključuje in rangeClosed ().

Metode dometa dostupne su samo za IntStream i LongStream.

Raspon možemo koristiti kao izmišljeni oblik svake petlje:

IntStream.rangeClosed (1, 5) .forEach (System.out :: println);

Dobro je koristiti ih kao zamjenu za svaku petlju što možemo iskoristiti i paralelno izvršavanje:

IntStream.rangeClosed (1, 5) .parallel () .forEach (System.out :: println);

Koliko god bile korisne ove otmjene petlje, za jednostavne iteracije ipak je bolje koristiti tradicionalne for-petlje umjesto funkcionalne zbog jednostavnosti, čitljivosti i izvedbe u nekim slučajevima.

5. Boks i raspakiranje

Postoje trenuci kada moramo pretvoriti primitivne vrijednosti u njihove ekvivalente omotača.

U tim slučajevima možemo koristiti u kutiji () metoda:

Popis evenInts = IntStream.rangeClosed (1, 10) .filter (i -> i% 2 == 0) .boxed () .collect (Collectors.toList ());

Također možemo pretvoriti iz toka klase omotača u primitivni tok:

// vraća 78 int sum = Arrays.asList (33,45) .stream () .mapToInt (i -> i) .sum ();

Uvijek možemo koristiti mapToXxx i flatMapToXxx metode za stvaranje primitivnih tokova.

6. Zaključak

Java Streams vrlo je moćan dodatak jeziku. Ovdje smo jedva ogrebali površinu primitivnih potoka, ali, kao što ih već možete koristiti za produktivnost.

Kao i uvijek, uzorci koda mogu se naći na GitHubu.


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