Introduksjon til Java 8 Streams

1. Oversikt

I denne artikkelen ser vi raskt på en av de viktigste delene av ny funksjonalitet Java 8 hadde lagt til - Strømmer.

Vi forklarer hva strømmer handler om og viser opprettelsen og grunnleggende strømoperasjoner med enkle eksempler.

2. Stream API

En av de viktigste nye funksjonene i Java 8 er introduksjonen av strømfunksjonaliteten - java.util.stream - som inneholder klasser for behandling av sekvenser av elementer.

Den sentrale API-klassen er Strøm. Den følgende delen vil demonstrere hvordan strømmer kan opprettes ved hjelp av eksisterende dataleverandørkilder.

2.1. Stream Creation

Strømmer kan opprettes fra forskjellige elementkilder, f.eks. samling eller matrise ved hjelp av strøm() og av() metoder:

String [] arr = new String [] {"a", "b", "c"}; Stream stream = Arrays.stream (arr); stream = Stream.of ("a", "b", "c");

EN strøm() standardmetoden legges til Samling grensesnitt og tillater å opprette en Strøm bruker hvilken som helst samling som elementkilde:

Stream stream = list.stream (); 

2.2. Multi-threading With Streams

Stream API forenkler også multitrading ved å tilby parallelStream () metode som kjører operasjoner over strømens elementer i parallell modus.

Koden nedenfor gjør det mulig å kjøre metoden arbeid () parallelt for hvert element i strømmen:

list.parallelStream (). forEach (element -> doWork (element));

I den neste delen vil vi introdusere noen av de grunnleggende Stream API-operasjonene.

3. Strømoperasjoner

Det er mange nyttige operasjoner som kan utføres på en strøm.

De er delt inn i mellomliggende operasjoner (komme tilbake Strøm) og terminaloperasjoner (returner et resultat av bestemt type). Mellomliggende operasjoner tillater kjetting.

Det er også verdt å merke seg at operasjoner på strømmer ikke endrer kilden.

Her er et raskt eksempel:

lang telling = liste.strøm (). distinkt (). telling ();

distinkt() metoden representerer en mellomoperasjon, som skaper en ny strøm av unike elementer fra forrige strøm. Og telle() metoden er en terminaloperasjon, som returnerer strømens størrelse.

3.1. Itererende

Stream API hjelper til å erstatte til, for hver, og samtidig som løkker. Det gjør det mulig å konsentrere seg om operasjonens logikk, men ikke om iterasjonen over rekkefølgen av elementer. For eksempel:

for (String string: list) {if (string.contains ("a")) {return true; }}

Denne koden kan endres bare med en linje med Java 8-kode:

boolsk isExist = list.stream (). anyMatch (element -> element.contains ("a"));

3.2. Filtrering

De filter() metoden lar oss velge en strøm av elementer som tilfredsstiller et predikat.

Tenk for eksempel på følgende liste:

ArrayList-liste = ny ArrayList (); list.add ("One"); list.add ("OneAndOnly"); list.add ("Derek"); list.add ("Endre"); list.add ("fabrikk"); list.add ("justBefore"); list.add ("Italia"); list.add ("Italia"); list.add ("torsdag"); list.add (""); list.add ("");

Følgende kode oppretter en Strøm av Liste, finner alle elementene i denne strømmen som inneholder røye “d”, og oppretter en ny strøm som bare inneholder de filtrerte elementene:

Stream stream = list.stream (). Filter (element -> element.contains ("d"));

3.3. Kartlegging

Å konvertere elementer i en Strøm ved å bruke en spesiell funksjon på dem og samle disse nye elementene i en Strøm, kan vi bruke kart() metode:

Liste uris = ny ArrayList (); uris.add ("C: \ My.txt"); Stream stream = uris.stream (). Kart (uri -> Paths.get (uri));

Så koden ovenfor konverterer Strøm til Strøm ved å bruke et bestemt lambdauttrykk på hvert element i initialen Strøm.

Hvis du har en strøm der hvert element inneholder sin egen rekke av elementer og du vil lage en strøm av disse indre elementene, bør du bruke flatMap () metode:

Listedetaljer = ny ArrayList (); details.add (ny detalj ()); Stream stream = details.stream (). FlatMap (detalj -> detail.getParts (). Stream ());

I dette eksemplet har vi en liste over elementer av typen Detalj. De Detalj klasse inneholder et felt DELER, hvilken er en Liste. Ved hjelp av flatMap () metode, hvert element fra felt DELER vil bli ekstrahert og lagt til den nye resulterende strømmen. Etter det, den første Strøm Vil gå tapt.

3.4. Matchende

Stream API gir et praktisk sett med instrumenter for å validere elementer i en sekvens i henhold til noe predikat. For å gjøre dette kan en av følgende metoder brukes: anyMatch (), allMatch (), noneMatch (). Navnene deres er selvforklarende. Det er terminaloperasjoner som returnerer a boolsk:

boolsk isValid = list.stream (). anyMatch (element -> element.contains ("h")); // true boolean isValidOne = list.stream (). allMatch (element -> element.contains ("h")); // falsk boolsk isValidTwo = list.stream (). noneMatch (element -> element.contains ("h")); // falsk

For tomme bekker, er allMatch () metoden med et gitt predikat vil returnere ekte:

Stream.empty (). AllMatch (Objekter :: nonNull); // sant

Dette er en fornuftig standard, ettersom vi ikke finner noe element som ikke tilfredsstiller predikatet.

Tilsvarende anyMatch () metoden returnerer alltid falsk for tomme bekker:

Stream.empty (). AnyMatch (Objekter :: nonNull); // falsk

Igjen, dette er rimelig, ettersom vi ikke finner et element som tilfredsstiller denne tilstanden.

3.5. Reduksjon

Med Stream API kan du redusere en sekvens av elementer til en eller annen verdi i henhold til en spesifisert funksjon ved hjelp av redusere() metode av typen Strøm. Denne metoden tar to parametere: første startverdi, andre - akkumulatorfunksjon.

Se for deg at du har en Liste og du vil ha en sum av alle disse elementene og noen initialer Heltall (i dette eksempelet 23). Så du kan kjøre følgende kode, og resultatet blir 26 (23 + 1 + 1 + 1).

Liste heltall = Arrays.asList (1, 1, 1); Heltall redusert = heltall. Strøm (). Redusert (23, (a, b) -> a + b);

3.6. Samler inn

Reduksjonen kan også skaffes av samle inn() metode av typen Strøm. Denne operasjonen er veldig nyttig når du konverterer en strøm til en Samling eller a Kart og representerer en strøm i form av en enkelt streng. Det er en nytteklasse Samlere som gir en løsning for nesten alle typiske innsamlingsoperasjoner. For noen, ikke trivielle oppgaver, en skikk Samler kan opprettes.

Liste resultatListe = liste.strøm (). Kart (element -> element.toUpperCase ()). Samle (Collectors.toList ());

Denne koden bruker terminalen samle inn() operasjon for å redusere en Strøm til Liste.

4. Konklusjoner

I denne artikkelen berørte vi kort Java-strømmer - definitivt en av de mest interessante Java 8-funksjonene.

Det er mange mer avanserte eksempler på bruk av strømmer; Målet med denne oppskriften var bare å gi en rask og praktisk innføring i hva du kan begynne å gjøre med funksjonaliteten og som utgangspunkt for å utforske og videre læring.

Kildekoden som følger med artikkelen er tilgjengelig på GitHub.


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