Hvordan lære Java Stream API [+5 Resources]

En strøm i Java er en sekvens av elementer som sekvensielle eller parallelle operasjoner kan utføres på.

Det kan være et «n» antall mellomoperasjoner og til slutt en terminaloperasjon, hvoretter resultatet returneres.

Hva er en strøm?

Strømmer kan administreres av Stream API, som ble introdusert i Java 8.

Se for deg Stream som en produksjonsrørledning der noen varer må produseres, sorteres og deretter pakkes for forsendelse. I Java er disse varene gjenstander eller samlinger av gjenstander, operasjonene er produksjon, sortering og pakking, og rørledningen er strømmen.

Komponentene i en strøm er:

  • En innledende inngang
  • Mellomoperasjoner
  • Terminaldrift
  • Sluttresultat

La oss utforske noen funksjoner i en strøm i Java:

  • Stream er ikke en datastruktur i minnet; snarere er det en sekvens av matriser, objekter eller samlinger av objekter som opereres på med visse metoder.
  • Strømmer er deklarative i naturen, dvs. du spesifiserer hva du skal gjøre, men ikke hvordan du gjør det.
  • De kan bare konsumeres én gang, da de ikke lagres noe sted.
  • Stream endrer ikke den opprinnelige datastrukturen; den henter bare en ny struktur fra den.
  • Den returnerer sluttresultatet avledet fra den endelige metoden i rørledningen.

Stream API vs. samlingsbehandling

En samling er en datastruktur i minnet som lagrer og behandler data. Samlinger gir datastrukturer som sett, kart, liste osv. for å lagre data. På den annen side er en strøm en måte å effektivt overføre data etter å ha behandlet dem gjennom en rørledning.

Her er et eksempel på en ArrayList-samling:

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add(0, 3);
        System.out.println(list);
    }
}

Output: 
[3]

Som du kan se i eksemplet ovenfor, kan du opprette en ArrayList-samling, lagre data i den og deretter operere på disse dataene ved hjelp av forskjellige metoder.

Ved å bruke en strøm kan du operere på en eksisterende datastruktur og returnere en ny endret verdi. Nedenfor er et eksempel på å lage en ArrayList-samling og filtrere den ved hjelp av en strøm.

import java.util.ArrayList;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList();

        for (int i = 0; i < 20; i++) {
            list.add(i+1);
        }

        System.out.println(list);

        Stream<Integer> filtered = list.stream().filter(num -> num > 10);
        filtered.forEach(num -> System.out.println(num + " "));
    }
}

#Output

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 

I eksemplet ovenfor opprettes en strøm ved å bruke den eksisterende listen , og listen gjentas for å filtrere verdier større enn 10. Legg merke til at strømmen ikke lagrer noe, listen gjentas bare, og resultatet skrives ut. Hvis du prøver å skrive ut strømmen, vil du få en referanse til strømmen i stedet for verdier.

Jobber med Java Stream API

Java Stream API tar inn en kildesamling av elementer eller en sekvens av elementer og utfører deretter operasjoner på dem for å utlede et sluttresultat. En bekk er bare en rørledning som en sekvens av elementer passerer og blir transformert på en eller annen måte.

En strøm kan opprettes fra forskjellige kilder, inkludert:

  • En samling som en liste eller sett.
  • En matrise.
  • Fra filer og deres stier ved hjelp av en buffer.

Det er to typer operasjoner som utføres i en strøm:-

  • Mellomliggende operasjoner
  • Terminaldrift

Middels vs. terminaloperasjoner

Hver mellomoperasjon returnerer en ny strøm internt som transformerer inngangen ved å bruke den angitte metoden. Ingenting er faktisk krysset; I stedet sendes den videre til neste bekk. Det er først ved terminaloperasjonen at strømmen krysses for å få ønsket resultat.

For eksempel har du en liste med 10 tall som du vil filtrere ut og deretter kartlegge til noe. Ikke alle elementer i listen vil bli krysset umiddelbart for å få det filtrerte resultatet og tilordne det til noe annet. I stedet vil individuelle elementer bli sjekket, og hvis de oppfyller betingelsen, blir de kartlagt. Nye strømmer for hvert element.

Kartoperasjonen vil bli utført på individuelle elementer som tilfredsstiller filteret og ikke hele listen. Og på tidspunktet for terminaloperasjonen blir de krysset og kombinert til et enkelt resultat.

Etter å ha utført terminaloperasjonen, forbrukes strømmen og kan ikke lenger brukes videre. Du må opprette en ny strøm for å utføre de samme operasjonene igjen.

Kilde: The Bored Dev

Med en forståelse på overflatenivå av hvordan strømmer fungerer, la oss gå inn i implementeringsdetaljene til strømmer i Java.

#1. En tom strøm

Opprett en tom strøm ved å bruke den tomme metoden til Stream API.

import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        Stream emptyStream = Stream.empty();
        System.out.println(emptyStream.count());
    }
}

Output:
0

Her, hvis du skriver ut antall elementer i denne strømmen, får du 0 som utdata fordi det er en tom strøm uten elementer. Tomme strømmer er ganske nyttige for å unngå null-pekerunntak.

#2. Strøm fra samlinger

Samlinger som Lists og Set viser en stream()-metode som lar deg lage en strøm fra en samling. Den opprettede strømmen kan deretter krysses for å få sluttresultatet.

ArrayList<Integer> list = new ArrayList();

for (int i = 0; i < 20; i++) {
    list.add(i+1);
}

System.out.println(list);

Stream<Integer> filtered = list.stream().filter(num -> num > 10);
filtered.forEach(num -> System.out.println(num + " "));

#Output

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 

#3. Strøm fra Arrays

Metoden Arrays.stream() brukes for å lage en strøm fra en matrise.

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        String[] stringArray = new String[]{"this", "is", "tipsbilk.net"};
        Arrays.stream(stringArray).forEach(item -> System.out.print(item + " "));
    }
}

#Output

this is tipsbilk.net 

Du kan også spesifisere start- og sluttindeksen til elementene du vil lage en strøm av. Startindeksen er inkluderende, mens sluttindeksen er eksklusiv.

String[] stringArray = new String[]{"this", "is", "tipsbilk.net"};
Arrays.stream(stringArray, 1, 3).forEach(item -> System.out.print(item + " "));

Output:
is tipsbilk.net

#4. Finne minimum og maks tall ved hjelp av Streams

Tilgang til maksimum og minimum antall av en samling eller en matrise kan gjøres ved å bruke komparatorer i Java. Metodene min() og max() aksepterer en komparator og returnerer et valgfritt objekt.

Et valgfritt objekt er et beholderobjekt som kan inneholde en verdi som ikke er null. Hvis den inneholder en verdi som ikke er null, vil det returnere verdien ved å kalle get()-metoden på den.

import java.util.Arrays;
import java.util.Optional;

public class MinMax {
    public static void main(String[] args) {
        Integer[] numbers = new Integer[]{21, 82, 41, 9, 62, 3, 11};

        Optional<Integer> maxValue = Arrays.stream(numbers).max(Integer::compare);
        System.out.println(maxValue.get());

        Optional<Integer> minValue = Arrays.stream(numbers).min(Integer::compare);
        System.out.println(minValue.get());
    }
}

#Output
82
3

Læringsressurser

Nå som du har en grunnleggende forståelse av Streams i Java, her er 5 ressurser for deg å bli godt kjent med Java 8:

#1. Java 8 i aksjon

Denne boken er en guide som viser frem nye funksjoner i Java 8, inkludert strømmer, lambdaer og funksjonell stilprogrammering. Quiz og kunnskapssjekkspørsmål er også en del av boken, som vil hjelpe deg å gjenopprette det du har lært.

Du kan få denne boken i pocketformat så vel som i lydbokformat på Amazon.

#2. Java 8 Lambdas: Funksjonell programmering for massene

Denne boken er spesielt utviklet for å lære sentrale Java SE-utviklere hvordan tillegg av Lambda-uttrykk påvirker Java-språket. Den inkluderer flytende forklaringer, kodeøvelser og eksempler for å mestre Java 8 lambda-uttrykk.

Den er tilgjengelig i pocketformat og Kindle-utgaven på Amazon.

#3. Java SE 8 for de virkelig utålmodige

Hvis du er en erfaren Java SE-utvikler, vil denne boken veilede deg gjennom forbedringene som er gjort i Java SE 8, stream API, tillegg av lambda-uttrykk, forbedringer av samtidig programmering i Java, og noen Java 7-funksjoner som de fleste har. vet ikke om.

Den er kun tilgjengelig i pocketformat på Amazon.

#4. Lær Java funksjonell programmering med lambdaer og strømmer

Dette kurset av Udemy utforsker det grunnleggende om funksjonell programmering i Java 8 og 9. Lambda-uttrykk, metodereferanser, strømmer og funksjonelle grensesnitt er konseptene dette kurset fokuserer på.

Den inkluderer også en haug med Java-oppgaver og øvelser relatert til funksjonell programmering.

#5. Java klassebibliotek

Java Class Library er en del av Core Java Specialization som tilbys av Coursera. Den vil lære deg hvordan du skriver typesikker kode ved å bruke Java Generics, forstå klassebiblioteket som består av over 4000 klasser, hvordan du arbeider med filer og håndterer kjøretidsfeil. Det er imidlertid noen forutsetninger for å ta dette kurset:

  • Introduksjon til Java
  • Introduksjon til objektorientert programmering med Java
  • Objektorienterte hierarkier i Java

Siste ord

Java Stream API og introduksjonen av Lambda-funksjoner i Java 8 forenklet og forbedret mange ting i Java, som parallell iterasjon, funksjonelle grensesnitt, mindre kode osv.

Strømmer har imidlertid noen begrensninger; deres største begrensning er at de bare kan konsumeres én gang. Hvis du er en Java-utvikler, kan ressursene nevnt ovenfor hjelpe deg med å forstå disse emnene mye mer detaljert, så sørg for å sjekke dem ut.

Du vil kanskje også vite om unntakshåndtering i Java.