Primitív típusú adatfolyamok a Java 8-ban

1. Bemutatkozás

A Stream API volt a Java 8 egyik legfontosabb funkciója.

Röviden: az API lehetővé teszi számunkra a gyűjtemények és más elemsorozatok feldolgozását - kényelmesen és hatékonyabban - egy deklaratív API biztosításával.

2. Primitív folyamok

A folyamok elsősorban tárgygyűjteményekkel működnek, és nem primitív típusokkal.

Szerencsére a három leggyakrabban használt primitív típussal való együttműködés biztosítása int, hosszú és kettős - a standard könyvtár három primitív-speciális megvalósítást tartalmaz: IntStream, LongStream, és DoubleStream.

A primitív folyamok korlátozottak elsősorban a boksz fölött, és azért, mert más primitívek számára speciális csatornák létrehozása sok esetben nem olyan hasznos.

3. Számtani műveletek

Kezdjünk néhány érdekes módszerrel az erősen használt számtani műveletekhez, mint pl min, max, összeg, és átlagos:

int [] egész számok = új int [] {20, 98, 12, 7, 35}; int min = tömbök.stream (egész számok) .min () .getAsInt (); // 7-et ad vissza

Most lépjünk át a fenti kódrészleten, hogy megértsük, mi történik.

Mi hoztuk létre a mi IntStream használva java.util.Arrays.stream (int []) majd felhasználta a perc () metódus a legkisebb egész szám megszerzéséhez as java.util.OptionalInt és végül felhívott getAsInt () hogy megkapja a int érték.

A. Létrehozásának másik módja IntStream használ IntStream.of (int…). A max () metódus adja vissza a legnagyobb egész számot:

int max = IntStream.of (20, 98, 12, 7, 35) .max () .getAsInt (); // 98-at ad vissza

Következő - az egész számok összegének megszerzéséhez csak hívjuk a összeg() módszer, és nem kell használnunk getAsInt () mivel már eredményként adja vissza az eredményt int érték:

int összeg = IntStream.of (20, 98, 12, 7, 35) .sum (); // visszatér a 172-re

Felhívjuk a átlagos() módszerrel kapjuk meg az egész számok átlagát, és amint láthatjuk, használnunk kell getAsDouble () mivel egy típusú értéket ad vissza kettős.

double avg = IntStream.of (20, 98, 12, 7, 35) .átlag () .getAsDouble (); // 34,4-et ad vissza

4. Tartomány

Készíthetünk egy IntStream tartomány alapján:

int összeg = IntStream.range (1, 10) .sum (); // a 45 int összegét adja = IntStream.rangeClosed (1, 10) .sum (); // 55-öt ad vissza

Amint a fenti kódrészlet mutatja, kétféle módon lehet létrehozni egy egész értéktartományt hatótávolság() és rangeClosed ().

A különbség az, hogy hatótávolság() exkluzív, míg inkluzív rangeClosed ().

A hatótávolsági módszerek csak IntStream és LongStream.

Használhatjuk a tartományt az egyes hurkok divatos formájaként:

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

Az a jó, ha mindegyik hurokhelyettesítőként használjuk őket, hogy kihasználhatjuk a párhuzamos végrehajtás előnyeit is:

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

Bármennyire is hasznosak ezek a divatos hurkok, még mindig jobb, ha az egyszerűség, az olvashatóság és a teljesítmény miatt egyes esetekben egyszerűbb iterációkhoz a funkcionális helyett a hagyományos for-ciklusokat kell használni.

5. Ökölvívás és kicsomagolás

Vannak esetek, amikor a primitív értékeket át kell alakítanunk burkoló egyenértékeikre.

Ezekben az esetekben használhatjuk a dobozos () módszer:

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

Átalakíthatunk a wrapper osztály adatfolyamáról a primitív adatfolyamra is:

// 78 int összeg = Arrays.asList (33,45) .stream () .mapToInt (i -> i) .sum ();

Mindig használhatjuk mapToXxx és flatMapToXxx módszerek primitív folyamok létrehozására.

6. Következtetés

A Java Streams nagyon hatékony kiegészítője a nyelvnek. Alig karcoltuk meg itt a primitív folyamok felületét, de mivel már használhatja őket produktivitásra.

És mint mindig, a kódminták megtalálhatók a GitHubon.