Was ist die Java 8 Stream API und wie kann sie Ihren Code transformieren?
Die Java 8 Stream API ist für Java-Entwickler ein Wendepunkt und bietet eine neue Möglichkeit, Daten deklarativ und effizient zu verarbeiten. Dieses Tutorial führt Sie durch die Einzelheiten der Stream API und hilft Ihnen, ihre leistungsstarken Funktionen zu verstehen und sie in Ihrem Code zu nutzen.
Inhaltsverzeichnis
Abschnitt | Beschreibung |
---|---|
Einführung | Übersicht über die Java 8 Stream API |
Stream-Erstellung | Verschiedene Möglichkeiten zum Erstellen von Streams |
Zwischenoperationen | Erläuterung verschiedener Zwischenoperationen |
Terminalbetrieb | Überblick über den Terminalbetrieb und seine Auswirkungen |
Parallele Streams | So nutzen Sie parallele Streams für eine bessere Leistung |
Praxisbeispiele | Codebeispiele, die die Verwendung der Stream-API demonstrieren |
Vorteile der Verwendung der Stream-API | Vorteile der Verwendung von Stream API in der Java-Entwicklung |
Häufige Fehler | Häufige Fehler und wie man sie vermeidet |
Abschluss | Zusammenfassung der wichtigsten Punkte und abschließende Gedanken |
Einführung
Java 8 brachte eine Vielzahl neuer Funktionen in die Sprache, aber eine der wirkungsvollsten war die Stream-API. Diese API bietet einen funktionalen Ansatz zur Verarbeitung von Elementsequenzen, sodass Entwickler präziseren und lesbareren Code schreiben können. Streams sind keine Datenstrukturen, sondern Abstraktionen, mit denen Sie Daten deklarativ verarbeiten können.
Stream-Erstellung
Streams können aus verschiedenen Datenquellen wie Sammlungen, Arrays oder E/A-Kanälen erstellt werden. Hier sind einige gängige Möglichkeiten zum Erstellen von Streams:
Aus Sammlungen
Sie können aus jeder Sammlung (z. B. Liste, Set) einen Stream erstellen.
Aufführen Liste = Arrays.asList("a", "b", "c"); Stream stream = Liste.stream();
Aus Arrays
Sie können auch einen Stream aus einem Array erstellen.
String[] array = {"a", "b", "c"}; : Der Stream wird als Array bezeichnet.
Aus Dateien
Java NIO bietet eine Methode zum Erstellen eines Streams aus einer Datei.
Strom Zeilen = Dateien.Zeilen(Pfade.get("Datei.txt"));
Unendliche Streams
Sie können unendliche Streams erstellen mit Stream.generieren
oder Streamen.iterieren
.
Strom infiniteStream = Stream.iterate(0, n -> n + 1);
Zwischenoperationen
Zwischenoperationen geben einen neuen Stream zurück und werden verzögert ausgeführt, d. h. sie werden erst ausgeführt, wenn eine Terminaloperation aufgerufen wird. Sie werden zum Transformieren oder Filtern von Daten verwendet.
Filter
Filtert Elemente basierend auf einer Bedingung.
Strom gefilterterStream = stream.filter(s -> s.startsWith("a"));
Karte
Transformiert Elemente.
Strom LängeStream = stream.map(String::Länge);
Flache Karte
Flacht verschachtelte Strukturen ab.
Strom flatMappedStream = stream.flatMap(s -> Arrays.stream(s.split("")));
Sortiert
Sortiert Elemente.
Strom sortiertStream = stream.sortiert();
Unterscheidbar
Entfernt doppelte Elemente.
Strom differentStream = stream.distinct();
Begrenzen und Überspringen
Kürzt den Stream auf eine bestimmte Anzahl von Elementen oder überspringt die ersten n Elemente.
Strom begrenzterStream = stream.limit(2); übersprungenStream = stream.skip(2);
Terminalbetrieb
Terminaloperationen erzeugen ein Ergebnis oder einen Nebeneffekt und markieren das Ende der Stream-Verarbeitung. Sobald eine Terminaloperation ausgeführt wurde, kann der Stream nicht mehr verwendet werden.
für jede
Führt für jedes Element eine Aktion aus.
stream.forEach(System.out::println);
Sammeln
Konvertiert den Stream in eine Sammlung oder eine andere Datenstruktur.
Aufführen Liste = stream.sammeln(Sammler.toList());
Reduzieren
Reduziert den Stream auf einen einzelnen Wert.
Optional verkettet = stream.reduce((s1, s2) -> s1 + s2);
Zählen
Gibt die Anzahl der Elemente zurück.
lange Anzahl = Stream.Anzahl();
Spielbetrieb
Überprüft, ob ein, alle oder keines der Elemente einem bestimmten Prädikat entspricht.
boolean anyMatch = stream.anyMatch(s -> s.startsWith("a")); boolean allMatch = stream.allMatch(s -> s.length() > 1); boolean noneMatch = stream.noneMatch(s -> s.isEmpty());
„Erstes suchen“ und „Beliebige suchen“
Gibt das erste oder ein beliebiges Element aus dem Stream zurück.
Optional first = stream.findFirst(); Optional beliebig = stream.findAny();
Parallele Streams
Streams können problemlos in parallele Streams umgewandelt werden, um Mehrkernprozessoren zu nutzen und Vorgänge gleichzeitig auszuführen.
Strom parallelStream = Liste.parallelStream();
Parallele Streams können die Leistung bei großen Datensätzen erheblich verbessern, sollten jedoch mit Vorsicht verwendet werden, um Parallelitätsprobleme zu vermeiden.
Praxisbeispiele
Beispiel 1: Filtern und Sammeln
Filtern wir eine Liste von Zeichenfolgen, um diejenigen zu finden, die mit „a“ beginnen, und sammeln wir sie in einer neuen Liste.
Aufführen Ergebnis = Liste.stream() .filter(s -> s.startsWith("a")) .collect(Collectors.toList());
Beispiel 2: Map und Reduce
Wandeln Sie eine Liste von Zeichenfolgen in Großbuchstaben um und verketten Sie sie.
Optional Ergebnis = Liste.stream() .map(String::toUpperCase) .reduce((s1, s2) -> s1 + s2);
Beispiel 3: Sortieren und Begrenzen
Sortieren Sie eine Liste von Zeichenfolgen und erhalten Sie die ersten drei Elemente.
Aufführen Ergebnis = Liste.stream() .sortiert() .limit(3) .sammeln(Collectors.toList());
Vorteile der Verwendung der Stream-API
Prägnanter Code
Die Stream-API ermöglicht prägnanteren und lesbareren Code. Operationen, die früher mehrere Zeilen und Schleifen erforderten, können oft auf eine einzige Zeile reduziert werden.
Verbesserte Leistung
Durch die Möglichkeit, Daten parallel zu verarbeiten, kann die Stream-API die Leistung bei großen Datensätzen erheblich verbessern.
Paradigma der funktionalen Programmierung
Die Stream-API führt Konzepte der funktionalen Programmierung in Java ein und erleichtert so die Durchführung komplexer Datenmanipulationen auf deklarativere Weise.
Häufige Fehler
Wandlungsfähigkeit
Vermeiden Sie es, die Quelle des Streams innerhalb von Zwischenvorgängen zu ändern, da dies zu unvorhersehbarem Verhalten führen kann.
Parallele Streams
Verwenden Sie parallele Streams mit Vorsicht, da diese zu Parallelitätsproblemen führen können und nicht immer zu Leistungsverbesserungen führen.
Faule Auswertung
Denken Sie daran, dass Zwischenoperationen verzögert sind. Stellen Sie sicher, dass Sie eine Terminaloperation aufrufen, um die Verarbeitung auszulösen.
Abschluss
Die Java 8 Stream API ist ein leistungsstarkes Tool, das die Art und Weise, wie Sie Java-Code schreiben, verändern kann. Durch einen funktionalen Ansatz zur Datenverarbeitung ermöglicht es einen prägnanteren, lesbareren und effizienteren Code. Egal, ob Sie Daten filtern, transformieren oder aggregieren, die Stream API bietet eine flexible und leistungsstarke Lösung. Wie bei jedem Tool ist es wichtig, seine Fähigkeiten und Einschränkungen zu verstehen, um es effektiv nutzen zu können.
Erkunden Sie die Stream-API in Ihren Projekten und erleben Sie die Vorteile eines moderneren, funktionaleren Ansatzes zur Java-Programmierung.