Dieser Blog-Beitrag zeigt Ihnen, wie Sie ** Java 8 ** verwenden, um ** API ** zu streamen, um Daten deklarativ zu verarbeiten.
In Java sind Sammlungen und Arrays zwei gängige Datenstrukturen, die regelmäßig viele Vorgänge ausführen, z. B. Hinzufügen, Löschen, Ändern, Abfragen, Aggregieren, Statistiken und Filtern. Diese Operationen existieren auch in relationalen Datenbanken. Vor Java 8 ist das Arbeiten mit Sammlungen und Arrays jedoch nicht sehr praktisch.
Dieses Problem wurde in Java 8 durch die Einführung einer neuen Abstraktion namens Stream API erheblich behoben, mit der Sie Ihre Daten deklarativ verarbeiten können. Dieser Artikel zeigt Ihnen, wie Sie Stream verwenden. Bitte beachten Sie, dass die Leistung und die Prinzipien des Streams für diesen Artikel nicht von zentraler Bedeutung sind.
Streams bieten ein hohes Maß an Abstraktion von Java-Erfassungsoperationen und -Ausdrücken, indem Daten aus der Datenbank abgefragt werden, ähnlich wie bei SQL-Anweisungen.
Die Stream-API erhöht die Produktivität von Java-Programmierern erheblich und ermöglicht ihnen, effektiven, sauberen und präzisen Code zu schreiben.
Der zu verarbeitende Satz von Elementen wird als in der Pipeline übertragener Stream betrachtet. Diese Elemente können von Knoten in der Pipeline verarbeitet werden, z. B. von Filtern, Sortierungen und Aggregaten.
Im vorherigen Beispiel haben wir einige Plastikkugeln als Datenquelle verwendet, die roten Kugeln gefiltert und sie zu zufälligen Dreiecken geschmolzen. Ein weiterer Filter entfernt kleine Dreiecke. Das Dämpfungsmittel summiert die Umfänge.
Wie in der obigen Abbildung gezeigt, enthält ein Stream drei wichtige Operationen: Stream-Erstellung, Zwischenoperationen und Terminaloperationen.
In Java 8 können Sie viele Methoden verwenden, um einen Stream zu erstellen.
In Java 8 wurde zusätzlich zu vielen Stream-bezogenen Klassen die Auflistungsklasse selbst erweitert. Die Java 8 Stream-Methode kann eine Sammlung in einen Stream konvertieren.
List<String> strings = Arrays.asList("Hollis", "HollisChuang", "hollis", "Hello", "HelloWorld", "Hollis");
Stream<String> stream = strings.stream();
Im obigen Beispiel erstellen wir einen Stream aus einer vorhandenen Liste. Die parallelStream-Methode kann auch einen parallelen Stream für eine Sammlung erstellen.
Sie erstellen auch häufig Streams aus Sammlungen.
Mit der von Stream bereitgestellten Methode of kann ein Stream, der aus den angegebenen Elementen besteht, direkt zurückgegeben werden.
Stream<String> stream = Stream.of("Hollis", "HollisChuang", "hollis", "Hello", "HelloWorld", "Hollis");
Der obige Code verwendet die of-Methode, um einen Stream zu erstellen und zurückzugeben.
Streams haben viele Zwischenoperationen, die zu einer Pipeline kombiniert werden können. Jede Zwischenoperation ist wie ein Arbeiter in der Pipeline. Jeder Mitarbeiter kann einen Stream verarbeiten. Die Zwischenoperation gibt einen neuen Stream zurück.
Unten finden Sie eine Liste gängiger Zwischenoperationen.
filter Die Filtermethode wird verwendet, um Elemente nach festgelegten Kriterien zu filtern. Das folgende Codefragment verwendet die Filtermethode, um eine leere Zeichenfolge zu filtern.
List<String> strings = Arrays.asList("Hollis", "", "HollisChuang", "H", "hollis");
strings.stream().filter(string -> ! string.isEmpty()).forEach(System.out::println);
//Hollis, , HollisChuang, H, hollis
map Die Zuordnungsmethode ordnet jedes Element dem entsprechenden Ergebnis zu. Das folgende Code-Snippet verwendet die Map-Methode, um die Quadratnummer des entsprechenden Elements zu generieren.
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
numbers.stream().map( i -> i*i).forEach(System.out::println);
//9,4,4,9,49,9,25
limit/skip Limit gibt die ersten N Elemente des Streams zurück. Überspringen verwirft die ersten N Elemente von Stream. Das folgende Codeausschnitt verwendet die Limit-Methode, um die ersten vier Elemente zu speichern.
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
numbers.stream().limit(4).forEach(System.out::println);
//3,2,2,3
sorted Die sortierte Methode sortiert die Elemente eines Streams. Das folgende Codefragment verwendet die sortierte Methode, um die Elemente eines Streams zu sortieren.
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
numbers.stream().sorted().forEach(System.out::println);
//2,2,3,3,3,5,7
distinct Verwenden Sie die eindeutige Methode, um Duplikate zu entfernen. Das folgende Codefragment verwendet die eindeutige Methode zum Deduplizieren eines Elements.
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
numbers.stream().distinct().forEach(System.out::println);
//3,2,7,5
Als Nächstes werde ich anhand von Beispielen und Diagrammen erklären, was mit Stream passiert, nachdem Filter-, Zuordnungs-, Sortier-, Begrenzungs- und unterschiedliche Vorgänge ausgeführt wurden.
Der Code wird unten angezeigt.
List<String> strings = Arrays.asList("Hollis", "HollisChuang", "hollis", "Hello", "HelloWorld", "Hollis");
Stream s = strings.stream().filter(string -> string.length()<= 6).map(String::length).sorted().limit(3)
.distinct();
Die folgende Abbildung zeigt jeden Schritt und seine Ergebnisse.
Die Terminaloperation des Streams gibt auch Stream zurück. Wie konvertiere ich einen Stream in den gewünschten Typ? Zählen Sie beispielsweise die Elemente in einem Stream und konvertieren Sie diesen Stream in eine Sammlung. Dazu ist ein Terminalbetrieb erforderlich.
Terminaloperationen verbrauchen Stream und liefern das Endergebnis. Das heißt, nachdem eine Terminaloperation für einen Stream ausgeführt wurde, kann dieser Stream nicht wiederverwendet werden, und für diesen Stream sind keine Zwischenoperationen zulässig. Andernfalls wird eine Ausnahme ausgelöst.
java.lang.IllegalStateException: stream has already been operated upon or closed
Dies entspricht der Bedeutung des Sprichworts: "Sie können nicht zweimal in denselben Fluss treten."
Die folgende Tabelle zeigt allgemeine Terminaloperationen.
forEach Die forEach-Methode durchläuft die Elemente im Stream. Das folgende Codefragment verwendet forEach, um 10 Zufallszahlen zurückzugeben.
Random random = new Random();
random.ints().limit(10).forEach(System.out::println);
count Die Zählmethode zählt die Elemente im Stream.
List<String> strings = Arrays.asList("Hollis", "HollisChuang", "hollis","Hollis666", "Hello", "HelloWorld", "Hollis");
System.out.println(strings.stream().count());
//7
collect Eine Erfassungsoperation ist eine Reduktionsoperation, die verschiedene Parameter akzeptieren und Stream-Elemente im Zusammenfassungsergebnis akkumulieren kann.
List<String> strings = Arrays.asList("Hollis", "HollisChuang", "hollis","Hollis666", "Hello", "HelloWorld", "Hollis");
strings = strings.stream().filter(string -> string.startsWith("Hollis")).collect(Collectors.toList());
System.out.println(strings);
//Hollis, HollisChuang, Hollis666, Hollis
Als Nächstes werden wir weiterhin Filter, Karten, Sortierungen, Grenzwerte und Diagramme verwenden, die zeigen, dass separate Operationen ausgeführt wurden, um die Ergebnisse verschiedener Terminaloperationen auf dem im obigen Beispiel angegebenen Stream anzuzeigen.
Die folgende Abbildung zeigt anhand eines Beispiels die Ein- und Ausgänge aller in diesem Artikel beschriebenen Vorgänge.
Dieser Artikel beschreibt die Verwendung und Funktion von Streams in Java 8. Dieser Artikel behandelt auch das Erstellen von Streams, Zwischen-Streams und Terminal-Operationen.
Es gibt zwei Möglichkeiten, einen Stream zu erstellen: Die Stream-Methode der Sammlung und die Stream-Methode.
Stream-Zwischenoperationen können Streams verarbeiten. Sowohl die Eingabe als auch die Ausgabe der Zwischenoperation sind Streams. Zwischenoperationen umfassen Filter, Karten und Sortierungen.
Stream-Zwischenoperationen können einen Stream in einen anderen Container konvertieren, z. B. das Zählen der Elemente im Stream, das Konvertieren des Streams in eine Sammlung, das Iterieren der Elemente im Stream usw.
Recommended Posts