Uvod u StreamEx

1. Pregled

Jedna od najuzbudljivijih značajki Java 8 je Stream API - koji je, jednostavno rečeno, moćan alat za obradu sekvenci elemenata.

StreamEx je knjižnica koja pruža dodatnu funkcionalnost za standardni Stream API zajedno s poboljšanjima izvedbe.

Evo nekoliko osnovnih značajki:

  • Kraći i prikladniji načini obavljanja svakodnevnih zadataka
  • 100% kompatibilnost s originalnim JDK Potoci
  • Ljubaznost za paralelnu obradu: svaka nova značajka iskorištava prednost paralelnih tokova što je više moguće
  • Performanse i minimalni troškovi. Ako StreamEx omogućuje rješavanje zadatka koristeći manje koda u odnosu na standardni Stream, ne bi trebao biti znatno sporiji od uobičajenog načina (a ponekad je i brži)

U ovom uputstvu predstavit ćemo neke značajke StreamEx API.

2. Postavljanje primjera

Koristiti StreamEx, trebamo dodati sljedeću ovisnost na pom.xml:

 one.util streamex 0.6.5 

Najnoviju verziju knjižnice možete pronaći na Maven Central.

Kroz ovaj tutorial koristit ćemo jednostavan Korisnik razred:

korisnik javne klase {int id; Naziv niza; Uloga uloge = nova uloga (); // standardni getteri, postavljači i konstruktori}

I jednostavan Uloga razred:

uloga javnog razreda {}

3. Kolekcionarske metode prečaca

Jedna od najpopularnijih operacija terminala Potoci je prikupiti operacija; to omogućuje prepakiranje Stream elemente u zbirku po našem izboru.

Problem je u tome što kod može postati nepotrebno opširan za jednostavne scenarije:

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

3.1. Prikupljanje u zbirku

Sada, sa StreamExom, ne trebamo pružati Kolektor kako bismo precizirali da nam treba a Popis, Set, Map, InmutableList, itd .:

Popis korisničkih imena = StreamEx.of (users) .map (User :: getName) .toList ();

The prikupiti Operacija je i dalje dostupna u API-ju ako želimo izvesti nešto složenije od uzimanja elemenata iz a Stream i stavljajući ih u kolekciju.

3.2. Napredni kolekcionari

Druga je stenografija grupiranjeBy:

Karta role2users = StreamEx.of (korisnici) .groupingBy (Korisnik :: getRole);

Ovo će proizvesti Karta s tipom ključa navedenim u referenci metode, stvarajući nešto slično grupi operacijom u SQL-u.

Koristeći običan Stream API, trebali bismo napisati:

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

Sličan stenografski obrazac može se naći za Kolekcionari.joining ():

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

Koji uzima sve elemente u Stream a proizvodi a Niz spajajući ih sve.

4. Dodavanje, uklanjanje i odabir elemenata

U nekim scenarijima, imamo popis objekata različitih vrsta i moramo ih filtrirati po vrstama:

Popis usersAndRoles = Arrays.asList (novi korisnik (), nova uloga ()); Popis uloga = StreamEx.of (usersAndRoles) .select (Role.class) .toList ();

Možemo dodati elemente na početak ili kraj našeg Stream, s ovim praktičnim operacijama:

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

Pomoću možemo ukloniti neželjene null elemente nonNull () i koristite Stream kao an Iterativ:

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

5. Podrška za matematičke operacije i primitivne tipove

StreamEx dodaje potpore za primitivne tipove, kao što možemo vidjeti u ovom samoobjašnjivom primjeru:

kratko [] src = {1,2,3}; char [] izlaz = IntStreamEx.of (src) .map (x -> x * 5) .toCharArray ();

Uzmimo sada niz od dvostruko elementi na neuređen način. Želimo stvoriti niz koji se sastoji od razlike između svakog para.

Možemo koristiti uparivanje karte metoda za izvođenje ove operacije:

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

6. Operacije na karti

6.1. Filtriranje po tipkama

Još jedna korisna značajka je sposobnost stvaranja a Stream od Karta i filtrirati elemente pomoću vrijednosti na koje pokazuju.

U ovom slučaju uzimamo sve vrijednosti koje nisu null:

Map nameToRole = novi HashMap (); nameToRole.put ("prva", nova uloga ()); nameToRole.put ("drugi", null); Postavi nonNullRoles = StreamEx.ofKeys (nameToRole, Objects :: nonNull) .toSet ();

6.2. Rad na parovima ključ / vrijednost

Također možemo raditi na parovima ključ / vrijednost stvaranjem EntryStream primjer:

javna Karta transformMap (Map role2users) {Karta users2roles = EntryStream.of (role2users) .flatMapValues ​​(List :: stream) .invert () .grouping (); vratiti korisnike2roles; }

Specijalna operacija EntryStream.of traje a Karta i pretvara ga u Stream objekata ključ-vrijednost. Tada koristimo flatMapValues operacija za pretvaranje našeg popisa uloga u Stream pojedinačnih vrijednosti.

Dalje, možemo obrnuti par ključ / vrijednost, čineći Korisnik razred ključ i Uloga klasirati vrijednost.

I na kraju, možemo koristiti grupiranje operacija za pretvaranje naše karte u inverziju primljene, a sve sa samo četiri operacije.

6.3. Mapiranje ključa / vrijednosti

Također možemo samostalno mapirati ključeve i vrijednosti:

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

Ovim možemo brzo transformirati svoje ključeve ili vrijednosti u drugu potrebnu vrstu.

7. Datoteke

Koristeći StreamEx, datoteke možemo čitati učinkovito, tj. bez učitavanja cijelih datoteka odjednom. Praktičan je prilikom obrade velikih datoteka:

StreamEx.ofLines (čitač) .remove (String :: isEmpty) .forEach (System.out :: println);

Imajte na umu da smo koristili ukloniti() metoda za filtriranje praznih redaka.

Ovdje valja napomenuti da je to StreamEx neće automatski zatvoriti datoteku. Stoga moramo imati na umu da ručno izvršimo operaciju zatvaranja i prilikom čitanja i prilikom pisanja datoteka kako bismo izbjegli nepotrebne troškove memorije.

8. Zaključak

U ovom uputstvu naučili smo o StreamEx, a to su različiti uslužni programi. Puno je još toga što treba proći - a oni ovdje imaju zgodan cheats sheet.

Kao i uvijek, puni izvorni kod dostupan je na GitHub-u.


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