Úvod do StreamEx

1. Prehľad

Jednou z najvzrušujúcejších funkcií Java 8 je Prúd API - čo je, zjednodušene povedané, výkonný nástroj na spracovanie sekvencií prvkov.

StreamEx je knižnica, ktorá poskytuje ďalšie funkcie pre štandardné Stream API spolu s vylepšeniami výkonu.

Tu je niekoľko základných funkcií:

  • Kratšie a pohodlné spôsoby vykonávania každodenných úloh
  • 100% kompatibilita s originálnymi JDK Prúdy
  • Prívetivosť pre paralelné spracovanie: akákoľvek nová funkcia v maximálnej miere využíva výhody paralelných streamov
  • Výkon a minimálna réžia. Ak StreamEx umožňuje riešenie úlohy s použitím menšieho množstva kódu v porovnaní so štandardom Prúd, nemalo by to byť výrazne pomalšie ako obvykle (a niekedy je to ešte rýchlejšie)

V tejto príručke predstavíme niektoré z funkcií aplikácie StreamEx API.

2. Príprava príkladu

Použit StreamEx, musíme pridať nasledujúcu závislosť do pom.xml:

 one.util streamex 0,6,5 

Najnovšiu verziu knižnice nájdete na serveri Maven Central.

Prostredníctvom tohto tutoriálu použijeme jednoduchý Používateľ trieda:

verejná trieda User {int id; Názov reťazca; Rola roly = nová rola (); // štandardní hľadači, zakladatelia a konštruktory}

A jednoduché Rola trieda:

rola verejnej triedy {}

3. Metódy skratiek zberateľov

Jedna z najpopulárnejších terminálových operácií v Prúdy je zbierať prevádzka; to umožňuje prebaľovanie Prúd prvky do zbierky podľa nášho výberu.

Problém je v tom, že kód môže byť zbytočne podrobný pre jednoduché scenáre:

users.stream () .map (User :: getName) .collect (Collectors.toList ());

3.1. Zbierka do zbierky

Teraz, s StreamEx, nemusíme poskytovať Zberateľ špecifikovať, že potrebujeme a Zoznam, Set, Map, InmutableList, atď.:

Zoznam userNames = StreamEx.of (users) .map (User :: getName) .toList ();

The zbierať operácia je v API stále k dispozícii, ak chceme vykonať niečo komplikovanejšie ako brať prvky z a Prúd a dať ich do zbierky.

3.2. Pokročilí zberatelia

Ďalšou skratkou je zoskupenieBy:

Mapa role2users = StreamEx.of (používatelia) .groupingBy (User :: getRole);

Toto vyprodukuje a Mapa s typom kľúča špecifikovaným v referencii metódy, produkujúci niečo podobné skupine operáciou v SQL.

Pomocou obyčajného Prúd API, musíme napísať:

Mapa role2users = users.stream () .collect (Collectors.groupingBy (User :: getRole));

Podobnú skratkovú formu možno nájsť v prípade Collectors.joining ():

StreamEx.of (1, 2, 3) .joining (";"); // „1; 2; 3“

Ktorý berie všetky prvky v Prúd a vyrába a String zreťazenie všetkých.

4. Pridávanie, odstraňovanie a výber prvkov

V niektorých scenároch máme zoznam objektov rôznych typov a musíme ich filtrovať podľa typu:

Zoznam usersAndRoles = Arrays.asList (nový užívateľ (), nová rola ()); Zoznam rolí = StreamEx.of (usersAndRoles) .select (Role.class) .toList ();

Na začiatok alebo na koniec nášho prvku môžeme pridať prvky Prúd, s týmito praktickými operáciami:

Zoznam appendedUsers = StreamEx.of (users) .map (User :: getName) .prepend ("(none)") .append ("LAST") .toList ();

Neželané nulové prvky môžeme odstrániť pomocou nonNull () a použite Prúd ako Iterable:

pre (String line: StreamEx.of (users) .map (User :: getName) .nonNull ()) {System.out.println (line); }

5. Matematické operácie a podpora primitívnych typov

StreamEx pridáva podporu pre primitívne typy, ako vidíme v tomto vysvetľujúcom príklade:

krátke [] src = {1,2,3}; char [] výstup = IntStreamEx.of (src) .map (x -> x * 5) .toCharArray ();

Teraz si vezmeme rad dvojitý neusporiadaným spôsobom. Chceme vytvoriť pole pozostávajúce z rozdielu medzi každým párom.

Môžeme použiť pairMap spôsob vykonania tejto operácie:

public double [] getDiffB BetweenPairs (double ... numbers) {return DoubleStreamEx.of (numbers) .pairMap ((a, b) -> b - a) .toArray (); }

6. Mapové operácie

6.1. Filtrovanie podľa kľúčov

Ďalšou užitočnou funkciou je schopnosť vytvoriť súbor Prúd od a Mapa a filtrovať prvky pomocou hodnôt, na ktoré ukazujú.

V tomto prípade berieme všetky nenulové hodnoty:

Názov mapyToRole = nový HashMap (); nameToRole.put ("prvý", nová rola ()); nameToRole.put ("druhý", null); Nastaviť nonNullRoles = StreamEx.ofKeys (nameToRole, Objects :: nonNull) .toSet ();

6.2. Pracujúce na pároch kľúč - hodnota

Môžeme tiež operovať na pároch kľúč - hodnota vytvorením EntryStream inštancia:

verejná mapa transformMap (mapa role2users) {Mapa users2roles = EntryStream.of (role2users) .flatMapValues ​​(List :: stream) .invert () .grouping (); návrat users2roles; }

Špeciálna operácia EntryStream.of berie a Mapa a transformuje ho do a Prúd objektov kľúč - hodnota. Potom použijeme flatMapValues operácia na transformáciu nášho zoznamu rolí na a Prúd jednotlivých hodnôt.

Ďalej môžeme obrátiť pár kľúč - hodnota, čím sa Používateľ trieda kľúč a Rola triediť hodnotu.

A nakoniec môžeme použiť zoskupenie operácia na transformáciu našej mapy na inverziu prijatej, všetko iba so štyrmi operáciami.

6.3. Mapovanie párov kľúč - hodnota

Kľúče a hodnoty môžeme mapovať aj nezávisle:

Mapa mapToString = EntryStream.of (users2roles) .mapKeys (String :: valueOf) .mapValues ​​(String :: valueOf) .toMap ();

Vďaka tomu môžeme rýchlo transformovať naše kľúče alebo hodnoty na iný požadovaný typ.

7. Operácie so súbormi

Použitím StreamEx, môžeme súbory čítať efektívne, t. j. bez načítania celých súborov naraz. Je to užitočné pri spracovávaní veľkých súborov:

StreamEx.ofLines (čítačka) .remove (String :: isEmpty) .forEach (System.out :: println);

Všimnite si, že sme to použili odstrániť () metóda na odfiltrovanie prázdnych riadkov.

Tu je potrebné poznamenať, že StreamEx automaticky nezatvorí súbor. Preto musíme pamätať na to, aby sme manuálne vykonali operáciu zatvorenia pri príležitosti čítania aj zápisu súboru, aby sme sa vyhli zbytočnej režii pamäte.

8. Záver

V tomto tutoriáli sme sa dozvedeli niečo o StreamExa sú to rôzne nástroje. Je toho ešte veľa, čím treba prejsť - a majú tu šikovný podvádzací list.

Celý zdrojový kód je ako vždy k dispozícii na serveri GitHub.


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