Geekflare wird von unserem Publikum unterstützt. Es kann sein, dass wir durch den Kauf von Links auf dieser Seite Affiliate-Provisionen verdienen.
Unter Entwicklung Zuletzt aktualisiert: September 24, 2023
Weitergeben:
Invicti Web Application Security Scanner - die einzige Lösung, die eine automatische Überprüfung von Schwachstellen mit Proof-Based Scanning™ ermöglicht.

Ein Stream in Java ist eine Folge von Elementen, auf denen sequentielle oder parallele Operationen ausgeführt werden können.

Es kann eine “n”-Anzahl von Zwischenoperationen und schließlich eine Endoperation geben, nach der das Ergebnis zurückgegeben wird.

Was ist ein Stream?

Streams können über die Stream API verwaltet werden, die in Java 8 eingeführt wurde.

Stellen Sie sich einen Stream wie eine Produktionspipeline vor, in der einige Waren hergestellt, sortiert und dann für den Versand verpackt werden müssen. In Java sind diese Waren Objekte oder Sammlungen von Objekten, die Operationen sind Herstellung, Sortierung und Verpackung und die Pipeline ist der Stream.

Die Komponenten eines Streams sind:

  • Eine anfängliche Eingabe
  • Zwischenoperationen
  • Abschließende Operation
  • Endergebnis

Lassen Sie uns einige Merkmale eines Streams in Java untersuchen:

  • Ein Stream ist keine speicherinterne Datenstruktur, sondern eine Folge von Arrays, Objekten oder Sammlungen von Objekten, auf die mit bestimmten Methoden zugegriffen wird.
  • Streams sind deklarativer Natur, d.h. Sie geben an, was zu tun ist, aber nicht, wie es zu tun ist.
  • Sie können nur einmal konsumiert werden, da sie nirgendwo gespeichert werden.
  • Ein Stream verändert die ursprüngliche Datenstruktur nicht, sondern leitet nur eine neue Struktur daraus ab.
  • Er gibt das Endergebnis zurück, das sich aus der letzten Methode in der Pipeline ergibt.

Stream API vs. Verarbeitung von Sammlungen

Eine Sammlung ist eine In-Memory-Datenstruktur, die Daten speichert und verarbeitet. Sammlungen bieten Datenstrukturen wie Set, Map, List usw., um Daten zu speichern. Auf der anderen Seite ist ein Stream eine Möglichkeit, Daten nach der Verarbeitung durch eine Pipeline effizient zu übertragen.

Hier ein Beispiel für eine ArrayList-Sammlung:-

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);
 }
}

Ausgabe: 
[3]

Wie Sie im obigen Beispiel sehen, können Sie eine ArrayList-Sammlung erstellen, Daten darin speichern und dann mit verschiedenen Methoden auf diese Daten zugreifen.

Mit Hilfe eines Streams können Sie auf eine bestehende Datenstruktur einwirken und einen neuen, geänderten Wert zurückgeben. Im Folgenden finden Sie ein Beispiel für die Erstellung einer ArrayList-Sammlung und deren Filterung mithilfe eines Streams.

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 

Im obigen Beispiel wird ein Stream unter Verwendung der vorhandenen Liste erstellt und die Liste wird iteriert, um Werte größer als 10 herauszufiltern. Beachten Sie, dass der Stream nichts speichert. Die Liste wird lediglich durchlaufen und das Ergebnis wird gedruckt. Wenn Sie versuchen, den Stream zu drucken, erhalten Sie statt der Werte einen Verweis auf den Stream.

Arbeiten mit der Java Stream API

Die Java Stream API nimmt eine Quellensammlung von Elementen oder eine Folge von Elementen auf und führt dann Operationen mit ihnen durch, um ein Endergebnis zu erhalten. Ein Stream ist lediglich eine Pipeline, die eine Folge von Elementen durchläuft und auf irgendeine Weise transformiert wird.

Ein Stream kann aus verschiedenen Quellen erstellt werden, darunter:

  • Eine Sammlung wie eine Liste oder ein Set.
  • Einem Array.
  • Aus Dateien und deren Pfaden unter Verwendung eines Puffers.

Es gibt zwei Arten von Operationen, die in einem Stream ausgeführt werden:-

  • Intermediäre Operationen
  • Terminale Operationen

Zwischenoperationen vs. Endoperationen

Jede Zwischenoperation gibt intern einen neuen Stream zurück, der die Eingabe mit der angegebenen Methode umwandelt. Es wird nichts durchlaufen, sondern an den nächsten Stream weitergegeben. Erst bei der Terminaloperation wird der Stream durchlaufen, um das gewünschte Ergebnis zu erhalten.

Ein Beispiel: Sie haben eine Liste mit 10 Zahlen, die Sie herausfiltern und dann auf etwas abbilden möchten. Nicht jedes Element der Liste wird sofort durchlaufen, um das gefilterte Ergebnis zu erhalten und es auf etwas anderes zu übertragen. Stattdessen werden einzelne Elemente geprüft, und wenn sie die Bedingung erfüllen, werden sie zugewiesen. Neue Datenströme für jedes einzelne Element.

Der Zuordnungsvorgang wird für einzelne Elemente durchgeführt, die den Filter erfüllen, und nicht für die gesamte Liste. Und zum Zeitpunkt der abschließenden Operation werden sie durchlaufen und zu einem einzigen Ergebnis zusammengefasst.

Nach der Ausführung der Terminaloperation ist der Stream verbraucht und kann nicht mehr weiter verwendet werden. Sie müssen einen neuen Stream erstellen, um die gleichen Operationen erneut durchzuführen.

working of streams in java
Quelle: Der gelangweilte Dev

Nachdem wir nun verstanden haben, wie Streams funktionieren, wollen wir uns nun mit den Details der Implementierung von Streams in Java beschäftigen.

#1. Ein leerer Stream

Erstellen Sie einen leeren Stream, indem Sie die Methode empty der Stream API verwenden.

import java.util.stream.Stream;

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

#Ausgabe
0

Wenn Sie hier die Anzahl der Elemente in diesem Stream ausgeben, erhalten Sie 0 als Ausgabe, da es sich um einen leeren Stream ohne Elemente handelt. Leere Streams sind sehr hilfreich, um Nullzeiger-Ausnahmen zu vermeiden.

#2. Streams aus Sammlungen

Sammlungen wie Lists und Set verfügen über eine stream() -Methode, mit der Sie einen Stream aus einer Sammlung erstellen können. Der erzeugte Stream kann dann durchlaufen werden, um das Endergebnis zu erhalten.

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 von Arrays

Die MethodeArrays.stream() wird verwendet, um einen Stream aus einem Array zu erstellen.

import java.util.Arrays;

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

#Ausgabe

this is geekflare 

Sie können auch den Start- und Endindex der Elemente angeben, aus denen ein Stream erstellt werden soll. Der Startindex ist inklusiv, während der Endindex exklusiv ist.

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

#Output
this is geekflare

#4. Minimal- und Maximalzahlen mit Streams ermitteln

Der Zugriff auf die maximale und minimale Anzahl einer Sammlung oder eines Arrays kann mit Hilfe von Comparators in Java erfolgen. Die Methoden min() und max() akzeptieren einen Comparator und geben ein Optional-Objekt zurück.

Ein Optional-Objekt ist ein Container-Objekt, das einen Nicht-Null-Wert enthalten kann oder auch nicht. Wenn es einen Wert enthält, der nicht null ist, gibt der Aufruf der Methode get() den Wert zurück.

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());
 }
}

#Ausgabe
82
3

Lernressourcen

Da Sie nun ein grundlegendes Verständnis von Streams in Java haben, finden Sie hier 5 Ressourcen, mit denen Sie sich in Java 8 gut auskennen:

#1. Java 8 in Aktion

Dieses Buch ist ein Leitfaden, der die neuen Funktionen von Java 8 vorstellt, darunter Streams, Lambdas und funktionale Programmierung. Ein Quiz und Fragen zur Wissensüberprüfung sind ebenfalls Teil des Buches, die Ihnen helfen, das Gelernte wieder zu erlernen.

Sie können dieses Buch sowohl im Taschenbuchformat als auch im Hörbuchformat bei Amazon erhalten.

#2. Java 8 Lambdas: Funktionale Programmierung für die breite Masse

Dieses Buch ist speziell darauf ausgerichtet, Java SE-Entwicklern zu zeigen, wie sich die Einführung von Lambda-Ausdrücken auf die Java-Sprache auswirkt. Es enthält flüssige Erklärungen, Code-Übungen und Beispiele, damit Sie Java 8 Lambda-Ausdrücke beherrschen.

Es ist im Taschenbuchformat und als Kindle-Ausgabe auf Amazon erhältlich.

#3. Java SE 8 für die wirklich Ungeduldigen

Wenn Sie ein erfahrener Java SE-Entwickler sind, führt Sie dieses Buch durch die Verbesserungen in Java SE 8, die Stream-API, die Hinzufügung von Lambda-Ausdrücken, Verbesserungen bei der gleichzeitigen Programmierung in Java und einige Java 7-Funktionen, die den meisten Leuten nicht bekannt sind.

Vorschau Produkt Bewertung Preis
Java SE 8 for the Really Impatient Java SE 8 for the Really Impatient $7.31

Es ist nur im Taschenbuchformat bei Amazon erhältlich.

#4. Java Funktionale Programmierung mit Lambdas & Streams lernen

udemy java course "Learn Java Functional Programming with Lambdas & Streams"

Dieser Kurs von Udemy erforscht die Grundlagen der funktionalen Programmierung in Java 8 und 9. Lambda-Ausdrücke, Methodenreferenzen, Streams und funktionale Schnittstellen sind die Konzepte, auf die sich dieser Kurs konzentriert.

Er enthält auch eine Reihe von Java-Rätseln und Übungen zur funktionalen Programmierung.

#5. Java-Klassenbibliothek

coursera - java class library

Java Class Library ist ein Teil der Core Java-Spezialisierung, die von Coursera angeboten wird. Hier lernen Sie, wie Sie mit Java Generics typsicheren Code schreiben, die aus über 4000 Klassen bestehende Klassenbibliothek verstehen, wie Sie mit Dateien arbeiten und wie Sie Laufzeitfehler behandeln. Es gibt jedoch einige Voraussetzungen für die Teilnahme an diesem Kurs:

  • Einführung in Java
  • Einführung in die objektorientierte Programmierung mit Java
  • Objektorientierte Hierarchien in Java

Letzte Worte

Die Java Stream API und die Einführung von Lambda-Funktionen in Java 8 haben viele Dinge in Java vereinfacht und verbessert, z.B. parallele Iteration, funktionale Schnittstellen, weniger Code usw.

Allerdings haben Streams einige Einschränkungen; ihre größte Einschränkung ist, dass sie nur einmal konsumiert werden können. Die größte Einschränkung ist, dass sie nur einmal konsumiert werden können. Wenn Sie ein Java-Entwickler sind, können die oben genannten Ressourcen Ihnen helfen, diese Themen viel detaillierter zu verstehen, also schauen Sie sich diese an.

Vielleicht möchten Sie auch etwas über die Behandlung von Ausnahmen in Java erfahren.

  • Murtuza Surti
    Autor
Dank an unsere Sponsoren
Weitere gute Lektüre zum Thema Entwicklung
Energie für Ihr Unternehmen
Einige der Tools und Dienste, die Ihr Unternehmen beim Wachstum unterstützen.
  • Invicti nutzt das Proof-Based Scanning™, um die identifizierten Schwachstellen automatisch zu überprüfen und innerhalb weniger Stunden verwertbare Ergebnisse zu erzielen.
    Versuchen Sie Invicti
  • Web Scraping, Residential Proxy, Proxy Manager, Web Unlocker, Search Engine Crawler und alles, was Sie zum Sammeln von Webdaten benötigen.
    Versuchen Sie Brightdata
  • Monday.com ist ein All-in-One-Betriebssystem, mit dem Sie Projekte, Aufgaben, Arbeit, Vertrieb, CRM, Arbeitsabläufe und vieles mehr verwalten können.
    Versuch Montag
  • Intruder ist ein Online-Schwachstellen-Scanner, der Schwachstellen in Ihrer Infrastruktur aufspürt, um kostspielige Datenschutzverletzungen zu vermeiden.
    Versuchen Sie Intruder