Introduksjon til StreamEx

1. Oversikt

En av de mest spennende funksjonene i Java 8 er Strøm API - som enkelt sagt er et kraftig verktøy for behandling av sekvenser av elementer.

StreamEx er et bibliotek som gir tilleggsfunksjonalitet for standard Stream API sammen med ytelsesforbedringene.

Her er noen kjernefunksjoner:

  • Kortere og praktiske måter å gjøre de daglige oppgavene på
  • 100% kompatibilitet med original JDK Strømmer
  • Vennlighet for parallell behandling: enhver ny funksjon utnytter fordelen på parallelle strømmer så mye som mulig
  • Ytelse og minimal overhead. Hvis StreamEx tillater å løse oppgaven med mindre kode sammenlignet med standard Strøm, det skal ikke være betydelig tregere enn vanlig måte (og noen ganger er det enda raskere)

I denne veiledningen presenterer vi noen av funksjonene i StreamEx API.

2. Sette opp eksemplet

Å bruke StreamEx, må vi legge til følgende avhengighet til pom.xml:

 one.util streamex 0.6.5 

Den siste versjonen av biblioteket finner du på Maven Central.

Gjennom denne opplæringen skal vi bruke en enkel Bruker klasse:

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

Og en enkel Roll klasse:

offentlig klasse rolle {}

3. Collectors Shortcut Methods

En av de mest populære terminaloperasjonene i Strømmer er den samle inn operasjon; dette muliggjør ompakking Strøm elementer til en samling vi ønsker.

Problemet er at koden kan bli unødvendig ordentlig for enkle scenarier:

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

3.1. Innsamling til en samling

Nå, med StreamEx, trenger vi ikke å tilby en Samler for å spesifisere at vi trenger en Liste, Set, Map, InmutableList, etc.:

Liste brukernavn = StreamEx.of (brukere). Kart (Bruker :: getName) .toList ();

De samle inn operasjonen er fortsatt tilgjengelig i API-et hvis vi ønsker å utføre noe mer komplisert enn å ta elementer fra en Strøm og sette dem i en samling.

3.2. Avanserte samlere

En annen stenografi er gruppering av:

Kart role2users = StreamEx.of (brukere) .groupingBy (bruker :: getRole);

Dette vil gi en Kart med nøkkeltypen som er spesifisert i metodereferansen, og produserer noe som ligner på gruppen ved hjelp av SQL.

Bruke vanlig Strøm API, vi trenger å skrive:

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

En lignende stenografisk form kan bli funnet for Collectors.joining ():

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

Som tar alle elementene i Strøm a produserer a String sammenkoble dem alle.

4. Legge til, fjerne og velge elementer

I noen scenarier, vi har en liste over objekter av forskjellige typer, og vi må filtrere dem etter type:

Liste brukereAndRoles = Arrays.asList (ny bruker (), ny rolle ()); Listeroller = StreamEx.of (usersAndRoles) .select (Role.class) .toList ();

Vi kan legge til elementer i begynnelsen eller slutten av vår Strøm, med denne praktiske operasjonen:

Liste appendedUsers = StreamEx.of (brukere). Kart (Bruker :: getName) .prepend ("(ingen)") .append ("SISTE") .toList ();

Vi kan fjerne uønskede nullelementer ved hjelp av nonNull () og bruk Strøm som en Iterabel:

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

5. Støtte for matematiske operasjoner og primitive typer

StreamEx legger til støtte for primitive typer, som vi kan se i dette selvforklarende eksemplet:

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

La oss nå ta en rekke dobbelt elementer på en uordnet måte. Vi ønsker å lage en matrise som består av forskjellen mellom hvert par.

Vi kan bruke pairMap metode for å utføre denne operasjonen:

offentlig dobbelt [] getDiffBetweenPairs (dobbelt ... tall) {return DoubleStreamEx.of (tall). pairMap ((a, b) -> b - a) .toArray (); }

6. Kartoperasjoner

6.1. Filtrering etter nøkler

En annen nyttig funksjon er evnen til å lage en Strøm fra en Kart og filtrer elementene ved å bruke verdiene de peker på.

I dette tilfellet tar vi alle verdier som ikke er null:

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

6.2. Opererer på nøkkelverdipar

Vi kan også operere på nøkkelverdipar ved å opprette en EntryStream forekomst:

offentlig kart transformMap (Kart role2users) {Kart users2roles = EntryStream.of (role2users) .flatMapValues ​​(List :: stream) .invert () .grouping (); returnere brukere2roles; }

Den spesielle operasjonen EntryStream.of tar en Kart og forvandler det til en Strøm av nøkkelverdier. Så bruker vi flatMapValues operasjon for å transformere vår liste over roller til en Strøm av enkeltverdier.

Neste kan vi invertere nøkkelverdiparet, noe som gjør Bruker klasse nøkkelen og Roll klasse verdien.

Og til slutt kan vi bruke gruppering operasjon for å transformere kartet vårt til inversjonen av den mottatte, alt med bare fire operasjoner.

6.3. Nøkkelverdikartlegging

Vi kan også kartlegge nøkler og verdier uavhengig:

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

Med dette kan vi raskt transformere nøklene eller verdiene til en annen nødvendig type.

7. Filoperasjoner

Ved hjelp av StreamEx, kan vi lese filer effektivt, dvs. uten å laste inn hele filer på en gang. Det er praktisk når du behandler store filer:

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

Merk at vi har brukt fjerne() metode for å filtrere bort tomme linjer.

Poeng å merke seg her er at StreamEx lukker ikke filen automatisk. Derfor må vi huske å utføre lukking manuelt både ved fillesing og skriving for å unngå unødvendig minneoverhead.

8. Konklusjon

I denne veiledningen har vi lært om StreamEx, og det er forskjellige verktøy. Det er mye mer å gå gjennom - og de har et praktisk jukseark her.

Som alltid er hele kildekoden tilgjengelig på GitHub.


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