Datenverarbeitung mit der Stream-API von Java 8

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.

Stream-Einführung

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.

Funktionen und Vorteile von Java-Streams

image.png

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.

Stream-Erstellung

In Java 8 können Sie viele Methoden verwenden, um einen Stream zu erstellen.

1. Erstellen Sie einen Stream mit einer vorhandenen Sammlung

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.

2. Erstellen Sie einen Stream mit der Stream-Methode

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.

Zwischenbetrieb des Stroms

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.

image.png

Unten finden Sie eine Liste gängiger Zwischenoperationen.

image.png

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.

image.png

Terminalgeschäft streamen

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.

image.png

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.

image.png

Überblick

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

Datenverarbeitung mit der Stream-API von Java 8
[Java] Stream API - Stream-Beendigungsverarbeitung
[Java] Stream API - Stream Zwischenverarbeitung
Ich habe versucht, die Java8 Stream API zu verwenden
Java Stream API
[Java] Stream-Verarbeitung
Versuchen Sie es mit der Stream-API in Java
[Java] Stream API / Map
[Java] Generieren Sie mithilfe der Stream-API eine verengte Liste aus mehreren Listen
Java Stream API Spickzettel
Java Stream API in 5 Minuten
Datenverarbeitung mit Apache Flink
[Java] Einführung in die Stream-API
Verwenden von Docker von Java Gradle
[Java] Stream API Zwischenoperation
[java8] Um die Stream-API zu verstehen
Exportieren Sie ein Problem mithilfe der Java-API von JIRA
[Einführung in Java] Informationen zur Stream-API
Führen Sie node.js von Android Java aus (Verarbeitung)
Grundlegender Verarbeitungsablauf von Java Stream
Rufen Sie die Java-API von TensorFlow von Scala aus auf
Löschen von Dateien mit rekursiver Verarbeitung [Java]
Java 8 ~ Stream API ~ startet jetzt
Beispielcode mit Minio aus Java
Beispiel für die Verwendung der Bulk-API von Salesforce vom Java-Client mit PK-Chunking
[Java] Abrufen von Daten aus der Datenbank mithilfe des Singleton-Dienstes in Spring (Boot)
Ich habe versucht, die Elasticsearch-API in Java zu verwenden
Rufen Sie die GitHub-API über Javas Socket-API Teil2 auf
API-Integration von Java mit Jersey Client
Verwenden Sie den PostgreSQL-Datentyp (jsonb) aus Java
Heutzutage Java Lambda Expressions und Stream API
Mit Java Stream nach mehreren Bedingungen sortieren
Rufen Sie die Salesforce REST-API von Java aus auf
Kinesis-Datenströme ohne Java-Erfahrung (1)
Versuchen Sie es mit der JSON-Format-API in Java
Stellen Sie mit Eclipse eine Verbindung von Java zu MySQL her
Probieren Sie verschiedene Java Stream API-Methoden aus (jetzt)
Kinesis-Datenströme ohne Java-Erfahrung (3.1)
Versuchen Sie es mit der Emotion API von Android
Kinesis-Datenströme ohne Java-Erfahrung (3.2)
Rufen Sie die Microsoft Emotion API auf, indem Sie Bilddaten direkt von Java senden.
Greifen Sie über Java mit Axis2 Enterprise WSDL auf Forec.com zu
API-Memo streamen
Erstellen Sie eine API mit Retrofit2, Okhttp3 und Gson (Java).
ChatWork4j für die Verwendung der ChatWork-API in Java
[Java] API-Erstellung mit Jerjey (Jax-rs) mit Eclipse
Probieren Sie Java 8 Stream aus
[Java] Abrufen und Anzeigen des Datums 10 Tage später mithilfe der von Java 8 hinzugefügten Zeit-API.
Versuchen Sie, die Cloud Vision-API von GCP in Java zu verwenden
Java-Thread-Verarbeitung
[Verarbeitung × Java] Datentyp und objektorientierte Programmierung
Versuchen Sie, mit JZOS von Java aus auf das Dataset zuzugreifen
Java-String-Verarbeitung
Java 8 studieren (Stream)
Duplikatprüfung für Java8-Stream (ordentlich mit Collector schreiben)
[Java] Multithread-Verarbeitung