Bevezetés a StreamEx-be
1. Áttekintés
A Java 8 egyik legizgalmasabb tulajdonsága a Folyam API - egyszerűen fogalmazva, hatékony eszköz az elemek sorozatainak feldolgozására.
StreamEx egy olyan könyvtár, amely a funkcionalitás-fejlesztésekkel együtt további funkciókat biztosít a standard Stream API számára.
Íme néhány alapvető jellemző:
- A mindennapi feladatok elvégzésének rövidebb és kényelmes módjai
- 100% kompatibilitás az eredeti JDK-val Patakok
- Barátság a párhuzamos feldolgozáshoz: minden új szolgáltatás a lehető legnagyobb mértékben kihasználja a párhuzamos adatfolyamok előnyeit
- Teljesítmény és minimális rezsi. Ha StreamEx lehetővé teszi a feladat megoldását a szabványhoz képest kevesebb kód felhasználásával Folyam, nem lehet lényegesen lassabb, mint a szokásos módon (és néha még gyorsabb is)
Ebben az oktatóanyagban bemutatjuk a StreamEx API.
2. A példa beállítása
Használni StreamEx, hozzá kell adnunk a következő függőséget a pom.xml:
egy.util streamex 0.6.5
A könyvtár legújabb verziója megtalálható a Maven Central oldalon.
Ezen az oktatóanyagon keresztül egy egyszerűt fogunk használni Felhasználó osztály:
public class Felhasználó {int id; Karakterlánc neve; Szerepszerep = new Szerep (); // szokásos mérőeszközök, beállítók és kivitelezők}
És egy egyszerű Szerep osztály:
nyilvános osztály szerepe {}
3. Gyűjtők parancsikonjai
Az egyik legnépszerűbb terminálművelet Patakok az a gyűjt művelet; ez lehetővé teszi az újracsomagolást Folyam elemek egy általunk választott gyűjteményhez.
A probléma az, hogy a kód feleslegesen bonyolultabbá válhat egyszerű forgatókönyvek esetén:
users.stream () .map (Felhasználó :: getName) .collect (Collectors.toList ());
3.1. Gyűjtemény egy gyűjteménybe
A StreamEx használatával nem kell megadnunk a Gyűjtő annak megadásához, hogy szükségünk van a Lista, Set, Map, InmutableList, stb.:
List userNames = StreamEx.of (felhasználók) .map (Felhasználó :: getName) .toList ();
A gyűjt művelet továbbra is elérhető az API-ban, ha valami bonyolultabb dolgot akarunk végrehajtani, mint elemeket venni az a-ból Folyam és gyűjtésbe helyezi őket.
3.2. Haladó gyűjtők
Egy másik gyorsírás az csoportosításBy:
Térkép role2users = StreamEx.of (felhasználók) .groupingBy (Felhasználó :: getRole);
Ez a Térkép a metódus referenciában megadott kulcstípussal, valami hasonlót állít elő a csoporthoz az SQL műveletek alapján.
A sima használatával Folyam API, meg kell írnunk:
Térkép role2users = users.stream () .collect (Collectors.groupingBy (Felhasználó :: getRole));
Hasonló gyorsírási forma található a Collectors.joining ():
StreamEx.of (1, 2, 3). Csatlakozás (";"); // "1; 2; 3"
Ami az összes elemet a Folyam a termel a Húr összefűzve mindet.
4. Elemek hozzáadása, eltávolítása és kiválasztása
Bizonyos esetekben van egy listánk a különböző típusú objektumokról, és típus szerint kell szűrnünk őket:
List usersAndRoles = Arrays.asList (új felhasználó (), új szerep ()); Lista szerepek = StreamEx.of (usersAndRoles) .select (Role.class) .toList ();
Hozzáadhatunk elemeket a kezdetéhez vagy végéhez Folyam, ezzel a praktikus művelettel:
List appendedUsers = StreamEx.of (users) .map (User :: getName) .prepend ("(none)") .append ("LAST") .toList ();
A nem kívánt elemeket a nonNull () és használja a Folyam mint egy Iterálható:
for (Karaktersor: StreamEx.of (felhasználók) .map (Felhasználó :: getName) .nonNull ()) {System.out.println (sor); }
5. Matematikai műveletek és primitív típusok támogatása
StreamEx támogatja a primitív típusokat, amint ezt az önmagyarázó példában láthatjuk:
rövid [] src = {1,2,3}; char [] output = IntStreamEx.of (src) .map (x -> x * 5) .toCharArray ();
Most vegyünk egy tömböt kettős elemek rendezetlen módon. Tömböt szeretnénk létrehozni, amely az egyes párok közötti különbségből áll.
Használhatjuk a pairMap módszer a művelet végrehajtására:
public double [] getDiffBetweenPairs (dupla ... számok) {return DoubleStreamEx.of (számok) .pairMap ((a, b) -> b - a) .toArray (); }
6. Térkép műveletek
6.1. Szűrés kulcsok alapján
Egy másik hasznos tulajdonság a Folyam a-tól Térkép és szűrje az elemeket az általuk mutatott értékek felhasználásával.
Ebben az esetben az összes nem null értéket vesszük:
Térkép neveToRole = új HashMap (); nameToRole.put ("first", new Role ()); nameToRole.put ("második", null); Set nonNullRoles = StreamEx.ofKeys (nameToRole, Objects :: nonNull) .toSet ();
6.2. Kulcsértékű párokon működik
Kulcsérték-párokon is működhetünk egy EntryStream példa:
nyilvános Térkép transformMap (Térkép szerep2felhasználók) {Térkép users2roles = EntryStream.of (role2users) .flatMapValues (List :: stream) .invert () .grouping (); visszatérő felhasználók2szerepek; }
A különleges művelet EntryStream.of vesz egy Térkép és átalakítja a-vá Folyam kulcsértékű objektumok közül. Akkor használjuk flatMapValues művelet a szereplistánk átalakítására a-ra Folyam egyetlen érték.
Ezután megtehetjük megfordítani a kulcs-érték pár, így a Felhasználó osztályozza a kulcsot és a Szerep osztályozza az értéket.
És végül használhatjuk a csoportosítás művelet a térképünk átalakítására a kapott inverziójára, mindezt csak négy művelettel.
6.3. Kulcsérték-hozzárendelés
A kulcsokat és értékeket önállóan is feltérképezhetjük:
Map mapToString = EntryStream.of (users2roles) .mapKeys (String :: valueOf) .mapValues (String :: valueOf) .toMap ();
Ezzel gyorsan átalakíthatjuk kulcsainkat vagy értékeinket egy másik szükséges típusra.
7. Fájlműveletek
Használata StreamEx, hatékonyan olvashatunk fájlokat, vagyis a teljes fájlok egyszerre történő betöltése nélkül. Nagy fájlok feldolgozása közben hasznos:
StreamEx.ofLines (olvasó) .remove (String :: isEmpty) .forEach (System.out :: println);
Ne feledje, hogy használtuk eltávolítás () módszer az üres sorok kiszűrésére.
Fontos megjegyezni, hogy itt van StreamEx nem zárja be automatikusan a fájlt. Ezért emlékeznünk kell arra, hogy manuálisan végezzünk zárási műveletet mind a fájlolvasás, mind az írás során, hogy elkerüljük a felesleges memóriaterhelést.
8. Következtetés
Ebben az oktatóanyagban megtudtuk StreamEx, és ez különböző segédprogramok. Sokat kell még átélni - és itt van egy praktikus csalólapjuk.
Mint mindig, a teljes forráskód elérhető a GitHubon.