Zum Hauptinhalt springen

Wie Threads in Java funktionieren

Strimes sind eines der wichtigsten Merkmale der Programmiersprache Java, die bequeme und effektive Tools für die Arbeit mit Datensammlungen bietet. Die Verwendung von Streams vereinfacht die Verarbeitung und Filterung von Daten erheblich und ermöglicht die Optimierung des Codes durch parallele Berechnungen.

Das Grundprinzip von Streams besteht darin, Ketten von Datenoperationen zu erstellen. Jede Operation ist eine funktionale Schnittstelle, die auf Stream-Elemente angewendet wird. Solche Vorgänge können beispielsweise nach einer bestimmten Bedingung filtern, Sortieren, Konvertieren von Daten usw. sein.

Der Hauptvorteil von Streams in Java ist die Faulheit, dh die Ausführung von Operationen nur bei unmittelbarem Bedarf. Wenn beispielsweise eine Filteroperation in der Aktionskette vorhanden ist, wird sie nur für Elemente ausgeführt, die einer bestimmten Bedingung entsprechen, und die anderen Elemente werden ignoriert.

Darüber hinaus unterstützen Streams in Java parallele Berechnungen, sodass Sie Operationen parallelisieren und die Ressourcen des Computers effizient nutzen können. Dazu genügt es, die parallel() -Methode beim Stream aufzurufen. Beachten Sie jedoch, dass nicht alle Operationen parallele Berechnungen unterstützen und die Verwendung von Streams mit parallelen Operationen nicht immer effizient ist.

In diesem Artikel werden wir die grundlegenden Prinzipien der Funktionsweise von Streams in Java und deren Verwendung untersuchen. Wir werden lernen, wie man Streams erstellt, Datenoperationen anwendet, parallele Berechnungen verwendet und nicht triviale Aufgaben mit Streams löst. Außerdem werden wir die Tools zum Debuggen und Profilieren von Streams untersuchen, um den Code zu optimieren und seine Leistung zu verbessern.

Grundlegende Konzepte von Streams in Java

Strimes stellen ein neues Konzept in Java 8 für die Arbeit mit Datensammlungen dar. Sie bieten die Möglichkeit, verschiedene Vorgänge für Auflistungselemente auszuführen, z. B. Filtern, Sortieren, Summieren und andere, ohne Schleifen zu verwenden.

Grundlegende Konzepte von Streams:

Datenquelle: Der Stream ruft seine Daten von einer Quelle ab, die eine Sammlung, ein Array oder ein anderes Objekt sein kann, das die stream() -Methode bereitstellt. Sie können beispielsweise einen Stream für eine List-Sammlung wie folgt abrufen: list.stream().

Zwischenoperationen: Dies sind Operationen, die auf einen Stream angewendet werden können, nachdem er erstellt wurde, aber vor einer Terminaloperation. Durch Zwischenoperationen werden die ursprünglichen Daten nicht geändert, sondern ein neuer Stream erstellt, der die Ergebnisse der Operation enthält. Einige Beispiele für Zwischenoperationen umfassen filter(), map() und sorted().

Terminalbetrieb: Dies ist eine Operation, die zur Berechnung und Beendigung des Streams führt. Sie geben normalerweise einen Wert zurück oder führen Nebenwirkungen aus. Beispiele für Terminaloperationen sind forEach(), reduce() und collect().

Die Verarbeitung von Daten mithilfe von Streams in Java ermöglicht das Schreiben von kompakterem und expressivem Code, erleichtert das Lesen und Verstehen des Datenverarbeitungsalgorithmus. Sie ermöglichen auch die parallele Ausführung von Operationen, was die Leistung in Multithreadanwendungen verbessert.

Vorteile der Verwendung von Streams

Die Verwendung von Streams in Java bietet mehrere Vorteile, die den Code lesbarer, wartbarer und effizienter machen:

  1. Einfaches Lesen und Schreiben von Daten: Mit dem Stream können Sie Daten aus verschiedenen Quellen wie Dateien, Sammlungen und anderen einfach und effizient lesen und schreiben.
  2. Funktionale Programmierung: Strimes bieten die Möglichkeit, funktionale Programmierung in Java zu verwenden. Sie ermöglichen die Verwendung von Lambda-Ausdrücken und funktionalen Schnittstellen für eine flexiblere Datenverarbeitung.
  3. Parallele Datenverarbeitung: die Streams unterstützen die parallele Datenverarbeitung, wodurch Multithreading effizient genutzt und Aufgaben schneller ausgeführt werden können.
  4. Verbergen komplexer Operationen: mit Striemen können Sie die Komplexität von Datenverarbeitungsvorgängen wie Filtern, Sortieren und Transformieren verbergen, indem Sie eine Kette einfacher Methoden verwenden.
  5. Verbesserte Codelesbarkeit: Die Verwendung von Streams ermöglicht das Schreiben von Code, der für andere Entwickler leichter zu lesen und zu verstehen ist. Es wird deklarativer und ausdrucksvoller als herkömmliche Zyklen und Konstruktionen.

Insgesamt bieten Streams in Java ein leistungsfähiges Datenverarbeitungswerkzeug, das das Schreiben von Code erheblich vereinfacht und verbessert. Sie verbessern die Leistung und ermöglichen eine einfache Implementierung verschiedener Datenvorgänge.

Wie erstelle ich einen Stream in Java

Es gibt mehrere Möglichkeiten, einen Stream in Java zu erstellen:

List numbers = Arrays.asList(1, 2, 3, 4, 5);Stream stream = numbers.stream();
int[] array = ;IntStream stream = Arrays.stream(array);
Stream stream = Stream.of("Java", "Python", "C++");
Stream randomStream = Stream.generate(Math::random);
Stream evenNumbers = Stream.iterate(0, n -> n + 2);

Die oben beschriebenen Methoden veranschaulichen die verschiedenen Möglichkeiten, Streams in Java zu erstellen. Welche Methode verwendet wird, hängt von der spezifischen Aufgabe und der Verfügbarkeit der Daten ab. Mit Striemen können Sie Daten bequemer und flexibler bearbeiten, Operationen an mehreren Elementen durchführen, Ergebnisse filtern, transformieren und aggregieren.

Grundlegende Stream-Operationen

Streamer in Java stellen eine Reihe von Operationen für die Arbeit mit Daten bereit. Hier sind einige grundlegende Operationen, die Sie mit Streams anwenden können:

  • Zwischenoperationen: diese Vorgänge werden direkt auf dem Stream ausgeführt und geben einen neuen Stream zurück. Beispiele für solche Operationen sind filter , map , sorted und distinct . Sie ermöglichen es Ihnen, doppelte Streamelemente zu filtern, zu konvertieren, zu sortieren und zu entfernen.
  • Terminaloperationen: diese Vorgänge werden auf Stream ausgeführt und geben das Ergebnis zurück. Beispiele für solche Operationen sind count , collect , forEach und reduce . Sie ermöglichen es Ihnen, verschiedene Stream-Aktionen auszuführen, z. B. die Anzahl der Elemente zu berechnen, Elemente in einer Sammlung zu sammeln, für jedes Element eine Aktion auszuführen usw.
  • Parallele Operationen: strims unterstützen auch die parallele Datenverarbeitung. Dazu können Sie die Operationen parallel und parallelStream verwenden. Sie ermöglichen es Ihnen, die Verarbeitung von Elementen auf mehrere Threads aufzuteilen, was die Ausführung von Operationen beschleunigen kann.
  • Pipeline-Operationen: stream-Vorgänge können eine Pipeline bilden, in der das Ergebnis einer Operation zur Eingabe für die nächste wird. Sie können beispielsweise den Filter-Vorgang anwenden, um bestimmte Elemente auszuwählen, und dann den map-Vorgang anwenden, um die verbleibenden Elemente zu konvertieren.

Stream-Operationen ermöglichen es uns, Datensammlungen in einem funktionalen Stil bequem und effizient zu verarbeiten. Die Verwendung von Streams kann die Menge an Code erheblich reduzieren und die Operationen an Sammlungen vereinfachen.

Terminaloperationen und Zwischenoperationen

Streams in Java stellen eine Reihe von Vorgängen bereit, die auf Datenflusselemente angewendet werden können. Diese Operationen können in zwei Kategorien unterteilt werden: terminal und intermediate.

Die Terminaloperationen beenden den Stream und geben das Ergebnis zurück. Beispiele für Terminaloperationen sind die Methoden forEach, count, anyMatch, allMatch, noneMatch und reduce. Mit der forEach-Methode können Sie eine Aktion auf jedes Streamelement anwenden, count gibt die Anzahl der Elemente zurück, und die Methoden anyMatch, allMatch und noneMatch prüfen, ob mindestens ein, alle oder kein Streamelement eine bestimmte Bedingung erfüllt. Mit der Reduce-Methode können Sie alle Streamelemente auf einen Wert reduzieren, indem Sie die angegebene Funktion mit einer Batterie verwenden.

Zwischenoperationen transformieren oder filtern Streamelemente und geben einen neuen Stream zurück. Beispiele für Zwischenoperationen sind die Methoden map, filter, distinct, sorted und limit. Die map-Methode konvertiert jedes Stream-Element mit der angegebenen Funktion, filter filtert die Elemente, wobei nur diejenigen übrig bleiben, die die angegebene Bedingung erfüllen, und die Methoden distinct, sorted und limit entfernen Duplikate, sortieren die Elemente oder begrenzen ihre Anzahl entsprechend.

Durch die Kombination von Terminaloperationen und Zwischenoperationen können Sie den Datenfluss flexibel verarbeiten und verschiedene Operationen an Streamelementen durchführen. Terminaloperationen sind die "Endpunkte" eines Streams, und ohne diese kann kein Stream verwendet werden, und Zwischenoperationen können zur sequenziellen Anwendung auf die Daten verkettet werden.

Beispiel für die Verwendung von Streams in Java

Betrachten wir ein Beispiel für die Verwendung von Streams in Java, um eine Sammlung von Elementen des Typs Integer zu verarbeiten:

Wir haben eine Sammlung von Zahlen: [1, 2, 3, 4, 5]. Und wir möchten die folgenden Operationen an dieser Sammlung durchführen:

  1. Filtert nur ungerade Zahlen heraus.
  2. Erhöhen Sie jede Zahl um 1.
  3. Finden Sie die Summe aller Elemente.

So können Sie dies mit Streams tun:

List numbers = Arrays.asList(1, 2, 3, 4, 5);int sum = numbers.stream().filter(n -> n % 2 != 0).map(n -> n + 1).reduce(0, Integer::sum);System.out.println(sum); // Выведет: 9

Wir beginnen damit, einen Stream aus einer Sammlung von Zahlen mit der stream() -Methode zu erstellen. Dann filtern wir die Werte mit dem Lambda-Ausdruck n -> n % 2 != 0 , das nur ungerade Zahlen hinterlässt. Dann wenden wir eine Map-Operation an, die jede Zahl um 1 erhöht.

Schließlich haben wir die Reduce-Methode verwendet, die alle Stream-Elemente auf einen einzelnen Wert bringt. In diesem Fall haben wir den Anfangswert 0 und die Additionsoperation Integer::sum verwendet, um die Summe all dieser Elemente zu finden.

Die resultierende Summe ist 9, was das Ergebnis der Ausführung des Beispiels ist.