Bevezetés a Java 8 adatfolyamokba

1. Áttekintés

Ebben a cikkben gyorsan áttekintjük a Java 8 által hozzáadott új funkciók egyik fő elemét - a streameket.

Egyszerű példákkal elmagyarázzuk, mi a folyam, és bemutatjuk a létrehozást és az alapvető adatfolyam-műveleteket.

2. Stream API

A Java 8 egyik legfontosabb új szolgáltatása a stream funkció bevezetése - java.util.stream - amely osztályokat tartalmaz az elemek sorozatainak feldolgozásához.

A központi API osztály a Folyam. A következő szakasz bemutatja, hogyan hozhatók létre adatfolyamok a meglévő adatszolgáltató források felhasználásával.

2.1. Patak létrehozása

A patakok különböző elemforrásokból hozhatók létre pl. gyűjtemény vagy tömb segítségével folyam() és nak,-nek() mód:

Karakterlánc [] arr = új karakterlánc [] {"a", "b", "c"}; Stream stream = Tömbök.stream (arr); stream = Stream.of ("a", "b", "c");

A folyam() alapértelmezett metódus hozzáadódik a Gyűjtemény felületet, és lehetővé teszi a Folyam bármely gyűjteményt elemforrásként használhat:

Stream stream = list.stream (); 

2.2. Többszálas adatfolyamok

A Stream API egyszerűsíti a többszálas szálat azáltal, hogy a parallelStream () metódus, amely párhuzamos módban futtatja a folyam elemeit.

Az alábbi kód lehetővé teszi a módszer futtatását dolgozni() párhuzamosan a patak minden elemére:

list.parallelStream (). forEach (elem -> doWork (elem));

A következő részben bemutatjuk a Stream API alapvető műveleteit.

3. Stream műveletek

Sok hasznos művelet hajtható végre egy adatfolyamon.

Fel vannak osztva közbenső műveletek (Visszatérés Folyam) és terminálműveletek (határozott típusú eredményt ad vissza). A köztes műveletek lehetővé teszik a láncolást.

Azt is érdemes megjegyezni, hogy a folyamokon végzett műveletek nem változtatják meg a forrást.

Itt egy rövid példa:

long count = lista.folyam (). különálló (). szám ();

Így a különböző() A módszer egy köztes műveletet jelent, amely létrehoz egy új folyamot az előző adatfolyam egyedi elemeiből. És a számol() módszer terminálművelet, amely visszaadja a patak méretét.

3.1. Iteráló

A Stream API segít a helyettesítésben mert, az egyes, és míg hurkok. Lehetővé teszi a művelet logikájára való koncentrálást, de nem az elemek sorrendjének ismétlését. Például:

for (String string: list) {if (string.contains ("a")) {return true; }}

Ez a kód csak a Java 8 kód egyik sorával módosítható:

logikai isExist = list.stream (). anyMatch (element -> element.contains ("a"));

3.2. Szűrő

A szűrő() módszer lehetővé teszi számunkra, hogy olyan állományt válasszunk ki, amely kielégít egy állítmányt.

Vegyük például a következő listát:

ArrayList list = new ArrayList (); list.add ("One"); list.add ("OneAndOnly"); list.add ("Derek"); list.add ("Módosítás"); list.add ("gyár"); list.add ("justBefore"); list.add ("Olaszország"); list.add ("Olaszország"); list.add ("csütörtök"); list.add (""); list.add ("");

A következő kód létrehozza a Folyam a Lista, megtalálja ennek az adatfolyamnak az összes elemét, amely tartalmazza char „d”, és létrehoz egy új adatfolyamot, amely csak a szűrt elemeket tartalmazza:

Stream stream = list.stream (). Filter (element -> element.contains ("d"));

3.3. Térképezés

A. Elemeinek konvertálása Folyam speciális funkciót alkalmazva rájuk, és összegyűjtve ezeket az új elemeket a Folyam, használhatjuk a térkép() módszer:

List uris = new ArrayList (); uris.add ("C: \ My.txt"); Stream stream = uris.stream (). Map (uri -> Paths.get (uri));

Tehát a fenti kód konvertálódik Folyam hoz Folyam azáltal, hogy egy sajátos lambda kifejezést alkalmazunk a kezdőbetű minden elemére Folyam.

Ha van olyan adatfolyamod, ahol minden elem saját elemsorozatot tartalmaz, és létre akarod hozni a belső elemek áramát, akkor a flatMap () módszer:

Lista részletei = new ArrayList (); részletek.add (új Részlet ()); Stream stream = részletek.stream (). FlatMap (részlet -> detail.getParts (). Stream ());

Ebben a példában van egy típusú elemek listája Részlet. A Részlet osztály mezőt tartalmaz ALKATRÉSZEK, ami a Lista. A segítségével flatMap () módszerrel, minden elem a mezőből ALKATRÉSZEK kinyerjük és hozzáadjuk az új kapott adatfolyamhoz. Ezt követően a kezdőbetű Folyam el fog veszni.

3.4. Egyezés

A Stream API praktikus eszközkészletet ad a szekvencia elemeinek valamilyen predikátum szerint történő hitelesítésére. Ehhez a következő módszerek egyikét lehet használni: anyMatch (), allMatch (), noneMatch (). Nevük nem egyértelmű. Ezek olyan terminálműveletek, amelyek a logikai:

logikai isValid = list.stream (). anyMatch (element -> element.contains ("h")); // true boolean isValidOne = list.stream (). allMatch (element -> element.contains ("h")); // hamis logikai érték isValidTwo = list.stream (). noneMatch (elem -> elem.tartalmaz ("h")); // hamis

Üres folyamok esetén a allMatch () metódus adott predikátummal visszatér igaz:

Stream.empty (). AllMatch (Objektumok :: nonNull); // igaz

Ez ésszerű alapértelmezés, mivel nem találunk olyan elemet, amely nem felel meg az állítmánynak.

Hasonlóképpen a anyMatch () metódus mindig visszatér hamis üres adatfolyamok esetén:

Stream.empty (). AnyMatch (Objektumok :: nonNull); // hamis

Ez megint ésszerű, mivel nem találunk olyan elemet, amely kielégíti ezt a feltételt.

3.5. Csökkentés

A Stream API lehetővé teszi az elemek sorozatának bizonyos értékre történő csökkentését egy adott függvény szerint az csökkenteni () típusú módszer Folyam. Ez a módszer két paramétert vesz igénybe: az első - kezdő érték, a második - egy akkumulátor funkció.

Képzelje el, hogy van egy Lista és szeretné, hogy ezeknek az elemeknek az összege és néhány kezdőbetűje legyen Egész szám (ebben a példában 23). Tehát a következő kódot futtathatja, és az eredmény 26 (23 + 1 + 1 + 1) lesz.

Egész számok = tömbök. AsList (1, 1, 1); Csökkentett egész szám = egész számok.folyam (). Redukció (23, (a, b) -> a + b);

3.6. Gyűjtő

A csökkentést a gyűjt() típusú módszer Folyam. Ez a művelet nagyon hasznos, ha egy adatfolyamot konvertálunk a-ba Gyűjtemény vagy a Térkép és egyetlen áramlat formájában ábrázol egy folyamot. Van egy közműosztály Gyűjtők amelyek szinte minden tipikus gyűjtési műveletre megoldást nyújtanak. Egyesek számára nem triviális feladatok, szokás Gyűjtő létrehozható.

List resultList = list.stream (). Map (element -> element.toUpperCase ()). Collect (Collectors.toList ());

Ez a kód a terminált használja gyűjt() művelet a csökkentésére Folyam hoz Lista.

4. Konklúziók

Ebben a cikkben röviden kitértünk a Java folyamokra - mindenképpen az egyik legérdekesebb Java 8 szolgáltatásra.

Sokkal fejlettebb példa van a Streamek használatára; Ennek az írásnak csak az volt a célja, hogy gyors és gyakorlati bevezetést nyújtson be abba, hogy mit kezdhet el a funkcionalitással, valamint kiindulópontként a feltáráshoz és a továbbtanuláshoz.

A cikket kísérő forráskód elérhető a GitHubon.


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