Sådan lærer du Java Stream API [+5 Resources]

En strøm i Java er en sekvens af elementer, hvorpå sekventielle eller parallelle operationer kan udføres.

Der kan være et “n” antal mellemliggende operationer og til sidst en terminal operation, hvorefter resultatet returneres.

Hvad er en stream?

Streams kan administreres af Stream API, som blev introduceret i Java 8.

Forestil dig Stream som en produktionspipeline, hvor nogle varer skal fremstilles, sorteres og derefter pakkes til forsendelse. I Java er disse varer objekter eller samlinger af objekter, operationerne er fremstilling, sortering og pakning, og rørledningen er strømmen.

Komponenterne i en strøm er:

  • Et indledende input
  • Mellemliggende operationer
  • Terminaldrift
  • Slutresultat

Lad os udforske nogle funktioner i en stream i Java:

  • Stream er ikke en datastruktur i hukommelsen; snarere er det en sekvens af arrays, objekter eller samlinger af objekter, som betjenes af bestemte metoder.
  • Strømme er af deklarative karakter, dvs. du angiver, hvad du skal gøre, men ikke hvordan du gør det.
  • De kan kun indtages én gang, da de ikke opbevares nogen steder.
  • Stream ændrer ikke den oprindelige datastruktur; det udleder kun en ny struktur fra det.
  • Det returnerer slutresultatet afledt af den endelige metode i pipelinen.

Stream API vs. behandling af samlinger

En samling er en datastruktur i hukommelsen, der lagrer og behandler data. Samlinger giver datastrukturer såsom sæt, kort, liste osv. til at gemme data. På den anden side er en strøm en måde at effektivt overføre data efter at have behandlet dem gennem en pipeline.

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 ovenstående eksempel, kan du oprette en ArrayList-samling, gemme data i den og derefter arbejde på disse data ved hjælp af forskellige metoder.

  12 Bedste Field Service Management Software til at køre forretning problemfrit

Ved hjælp af en strøm kan du operere på en eksisterende datastruktur og returnere en ny ændret værdi. Nedenfor er et eksempel på at oprette en ArrayList-samling og filtrere den ved hjælp af en stream.

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 ovenstående eksempel oprettes en strøm ved hjælp af den eksisterende liste , og listen gentages for at filtrere værdier større end 10. Bemærk, at strømmen ikke gemmer noget, listen gentages bare, og resultatet udskrives. Hvis du forsøger at udskrive strømmen, får du en reference til strømmen i stedet for værdier.

Arbejder på Java Stream API

Java Stream API’en tager en kildesamling af elementer eller en sekvens af elementer ind og udfører derefter operationer på dem for at udlede et slutresultat. En strøm er blot en rørledning, hvorigennem en sekvens af elementer passerer og bliver transformeret på en eller anden måde.

En strøm kan oprettes fra forskellige kilder, herunder:

  • En samling såsom en liste eller sæt.
  • En række.
  • Fra filer og deres stier ved hjælp af en buffer.

Der er to typer operationer udført i en strøm:-

  • Mellemliggende operationer
  • Terminaldrift

Mellemliggende vs. terminaldrift

Hver mellemliggende operation returnerer en ny strøm internt, som transformerer inputtet ved hjælp af den specificerede metode. Intet er faktisk krydset; I stedet sendes det videre til næste vandløb. Det er kun ved terminaldriften, at strømmen gennemløbes for at få det ønskede resultat.

For eksempel har du en liste med 10 numre, som du vil filtrere fra og derefter kortlægge til noget. Ikke alle elementer på listen vil blive gennemgået med det samme for at få det filtrerede resultat og tilknytte det til noget andet. I stedet vil individuelle elementer blive kontrolleret, og hvis de opfylder betingelsen, bliver de kortlagt. Nye streams for hvert element.

  Hvad betyder "ICYMI", og hvordan bruger du det?

Kortoperationen vil blive udført på individuelle elementer, der opfylder filteret og ikke hele listen. Og på tidspunktet for terminaloperationen krydses de og kombineres til et enkelt resultat.

Efter at have udført terminaloperationen er strømmen forbrugt og kan ikke længere bruges yderligere. Du skal oprette en ny stream for at udføre de samme handlinger igen.

Kilde: The Bored Dev

Med en forståelse på overfladeniveau af, hvordan streams fungerer, lad os springe ind i implementeringsdetaljerne for streams i Java.

#1. En tom strøm

Opret en tom stream ved at bruge den tomme metode i 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 udskriver antallet af elementer i denne strøm, får du 0 som output, fordi det er en tom strøm uden elementer. Tomme streams er ganske nyttige til at undgå nul pointer-undtagelser.

#2. Stream fra samlinger

Samlinger såsom Lists og Set afslører en stream()-metode, der giver dig mulighed for at oprette en stream fra en samling. Den oprettede strøm kan derefter krydses for at få slutresultatet.

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. Stream fra Arrays

Arrays.stream()-metoden bruges til at oprette en strøm fra et array.

import java.util.Arrays;

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

#Output

this is toadmin.dk 

Du kan også angive start- og slutindekset for de elementer, der skal oprettes en strøm af. Startindekset er inklusive, mens slutindekset er eksklusivt.

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

Output:
is toadmin.dk

#4. Find min og maks tal ved hjælp af Streams

Adgang til maksimum og minimum antal af en samling eller et array kan gøres ved at bruge komparatorer i Java. Min() og max() metoderne accepterer en komparator og returnerer et Optional objekt.

Et valgfrit objekt er et beholderobjekt, som muligvis indeholder en ikke-nul værdi. Hvis den indeholder en værdi, der ikke er null, returneres værdien ved at kalde 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æringsressourcer

Nu hvor du har en grundlæggende forståelse af Streams i Java, er her 5 ressourcer, som du kan bruge til at blive fortrolig med Java 8:

  6 bedste PPC-styringssoftware til digitale marketingfolk toadmin.dk

#1. Java 8 i aktion

Denne bog er en guide, der viser nye funktioner i Java 8, herunder streams, lambdas og programmering i funktionel stil. Quizzer og videntjek-spørgsmål er også en del af bogen, som vil hjælpe dig med at gendanne det, du har lært.

Du kan få denne bog i et paperback-format såvel som i lydbogsformat på Amazon.

#2. Java 8 Lambdas: Funktionel programmering for masserne

Denne bog er specielt designet til at lære kerne Java SE-udviklere, hvordan tilføjelsen af ​​Lambda-udtryk påvirker Java-sproget. Det inkluderer flydende forklaringer, kodeøvelser og eksempler, så du kan mestre Java 8 lambda-udtryk.

Den er tilgængelig i paperback-format og Kindle-udgave på Amazon.

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

Hvis du er en erfaren Java SE-udvikler, vil denne bog guide dig gennem forbedringerne i Java SE 8, stream-API’en, tilføjelsen af ​​lambda-udtryk, forbedringer til samtidig programmering i Java og nogle Java 7-funktioner, som de fleste mennesker gør’ ved ikke om.

Den er kun tilgængelig i paperback-format på Amazon.

#4. Lær Java funktionel programmering med lambdaer og streams

Dette kursus af Udemy udforsker det grundlæggende i funktionel programmering i Java 8 og 9. Lambda-udtryk, metodereferencer, streams og funktionelle grænseflader er de begreber, som dette kursus fokuserer på.

Det inkluderer også en masse Java-puslespil og øvelser relateret til funktionel programmering.

#5. Java klassebibliotek

Java Class Library er en del af Core Java Specialization, der tilbydes af Coursera. Det vil lære dig, hvordan du skriver typesikker kode ved hjælp af Java Generics, forstår klassebiblioteket bestående af over 4000 klasser, hvordan du arbejder med filer og håndterer runtime-fejl. Der er dog nogle forudsætninger for at tage dette kursus:

  • Introduktion til Java
  • Introduktion til objektorienteret programmering med Java
  • Objektorienterede hierarkier i Java

Afsluttende ord

Java Stream API og introduktionen af ​​Lambda-funktioner i Java 8 forenklede og forbedrede mange ting i Java, såsom parallel iteration, funktionelle grænseflader, mindre kode osv.

Strømme har dog nogle begrænsninger; deres største begrænsning er, at de kun kan indtages én gang. Hvis du er en Java-udvikler, kan de ovenfor nævnte ressourcer hjælpe dig med at forstå disse emner meget mere detaljeret, så sørg for at tjekke dem ud.

Du vil måske også vide om undtagelseshåndtering i Java.