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.