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.