Introduktion til StreamEx

1. Oversigt

En af de mest spændende funktioner i Java 8 er Strøm API - som ganske enkelt er et kraftfuldt værktøj til behandling af sekvenser af elementer.

StreamEx er et bibliotek, der giver yderligere funktionalitet til standard Stream API sammen med forbedring af ydeevnen.

Her er et par kerneegenskaber:

  • Kortere og bekvemme måder at udføre de daglige opgaver på
  • 100% kompatibilitet med original JDK Strømme
  • Venlighed til parallel behandling: enhver ny funktion udnytter fordelene ved parallelle streams så meget som muligt
  • Ydeevne og minimal overhead. Hvis StreamEx gør det muligt at løse opgaven ved hjælp af mindre kode sammenlignet med standard Strøm, det skal ikke være væsentligt langsommere end den sædvanlige måde (og nogle gange er det endnu hurtigere)

I denne vejledning præsenterer vi nogle af funktionerne i StreamEx API.

2. Opsætning af eksemplet

At bruge StreamEx, skal vi tilføje følgende afhængighed af pom.xml:

 one.util streamex 0.6.5 

Den seneste version af biblioteket kan findes på Maven Central.

Gennem denne vejledning skal vi bruge en simpel Bruger klasse:

offentlig klasse bruger {int id; Strengnavn; Rollerolle = ny rolle (); // standard getters, setters og constructors}

Og en simpel Rolle klasse:

offentlig klasses rolle {}

3. Genveje Metoder til samlere

En af de mest populære terminaloperationer i Strømme er indsamle operation; dette giver mulighed for ompakning Strøm elementer til en samling efter eget valg.

Problemet er, at kode kan blive unødvendigt detaljeret for enkle scenarier:

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

3.1. Indsamling til en samling

Nu med StreamEx behøver vi ikke at levere en Samler at specificere, at vi har brug for en Liste, Set, Map, InmutableList, etc.:

Vis brugernavne = StreamEx.of (brugere). Kort (Bruger :: getName) .toList ();

Det indsamle operation er stadig tilgængelig i API'en, hvis vi vil udføre noget mere kompliceret end at tage elementer fra en Strøm og lægge dem i en samling.

3.2. Avancerede samlere

En anden stenografi er grupperingBy:

Kort role2users = StreamEx.of (brugere) .groupingBy (Bruger :: getRole);

Dette vil producere en Kort med den nøgletype, der er angivet i metodereferencen, og producerer noget, der ligner gruppen ved operation i SQL.

Brug almindelig Strøm API, vi skal skrive:

Kort role2users = users.stream () .collect (Collectors.groupingBy (Bruger :: getRole));

En lignende stenografisk form kan findes til Collectors.joining ():

StreamEx.of (1, 2, 3). Sammenføjning (";"); // "1; 2; 3"

Hvilket tager alle elementerne i Strøm a producerer en Snor sammenkædning af dem alle.

4. Tilføjelse, fjernelse og valg af elementer

I nogle scenarier, vi har en liste over objekter af forskellige typer, og vi skal filtrere dem efter type:

Vis brugereAndRoles = Arrays.asList (ny bruger (), ny rolle ()); Listeroller = StreamEx.of (usersAndRoles) .select (Role.class) .toList ();

Vi kan tilføje elementer til starten eller slutningen af ​​vores Strøm, med denne praktiske betjening:

Liste appendedUsers = StreamEx.of (brugere) .map (Bruger :: getName) .prepend ("(none)") .append ("LAST") .toList ();

Vi kan fjerne uønskede null-elementer ved hjælp af nonNull () og brug Strøm som en Iterabel:

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

5. Understøttelse af matematiske operationer og primitive typer

StreamEx tilføjer understøtninger til primitive typer, som vi kan se i dette selvforklarende eksempel:

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

Lad os nu tage en række dobbelt elementer på en uordnet måde. Vi ønsker at oprette en matrix bestående af forskellen mellem hvert par.

Vi kan bruge pairMap metode til at udføre denne handling:

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

6. Kortoperationer

6.1. Filtrering efter taster

En anden nyttig funktion er evnen til at oprette en Strøm fra en Kort og filtrer elementerne ved hjælp af de værdier, de peger på.

I dette tilfælde tager vi alle værdier, der ikke er nul:

Map nameToRole = ny HashMap (); nameToRole.put ("første", ny rolle ()); nameToRole.put ("second", null); Indstil nonNullRoles = StreamEx.ofKeys (nameToRole, Objects :: nonNull) .toSet ();

6.2. Drift på nøgleværdipar

Vi kan også operere på nøgleværdipar ved at oprette en EntryStream eksempel:

offentligt kort transformMap (kort role2users) {Kort users2roles = EntryStream.of (role2users) .flatMapValues ​​(List :: stream) .invert () .grouping (); returnere users2roles; }

Den særlige operation EntryStream.of tager en Kort og omdanner det til en Strøm af nøgleværdigenstande. Så bruger vi flatMapValues operation for at omdanne vores liste over roller til en Strøm af enkeltværdier.

Dernæst kan vi vende om nøgleværdipar, hvilket gør Bruger klasse nøglen og Rolle klasse værdien.

Og endelig kan vi bruge gruppering operation for at omdanne vores kort til inversion af det modtagne, alt sammen med kun fire operationer.

6.3. Kortlægning af nøgleværdi

Vi kan også kortlægge nøgler og værdier uafhængigt af hinanden:

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

Med dette kan vi hurtigt omdanne vores nøgler eller værdier til en anden krævet type.

7. Filhandlinger

Ved brug af StreamEx, kan vi læse filer effektivt, dvs. uden at indlæse fulde filer på én gang. Det er praktisk, når du behandler store filer:

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

Bemærk, at vi har brugt fjerne() metode til at filtrere tomme linjer væk.

Punkt at bemærke her er, at StreamEx lukker ikke filen automatisk. Derfor skal vi huske at manuelt udføre lukning ved både fillæsning og skrivetilfælde for at undgå unødvendig hukommelse.

8. Konklusion

I denne vejledning har vi lært om StreamEx, og det er forskellige hjælpeprogrammer. Der er meget mere at gå igennem - og de har et praktisk snydeark her.

Som altid er den fulde kildekode tilgængelig på GitHub.


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