Unsere Datenschutzrichtlinie wird in Kürze aktualisiert. Bitte sehen Sie sich die Vorschau an.

Java Grundkurs 3: Generische Programmierung, Datenströme, Datumsrechnung

Optimierung mithilfe der Stream API

Testen Sie unsere 2015 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
In diesem Video liefert Ihnen der Trainer eine Einführung in die funktionale Stream API. Dabei zeigt er, wie die vorhandenen Anweisungen des durchgehenden Programmierbeispiels mithilfe der funktionalen Stream API prägnanter programmiert werden können.

Transkript

In diesem Video gebe ich Ihnen eine Einführung in die Functional Stream API. Genauso wie eine Lambda-Expression ermöglicht auch ein Stream die Kodierung von kurzem und kompaktem Quelltext. Dabei wird jedes einzelne Element einer Datenreihe automatisch verarbeitet. Welchen Vorteil ein Stream bietet, lässt sich sehr gut anhand eines kleinen Beispiels zeigen. In den vorliegenden Beispielprogrammen habe ich zwei Modellklassen programmiert, die sich Katze und Messung nennen. Ein anderer Begriff für diese Klassen ist auch Java Beans oder PoJos, was die Abkürzung für Plane Old Java Objects ist. Es handelt sich also um zwei Klassen, derer Aufgabe es ist, die fachlichen Daten zu beherbergen. Die Klasse Messung verfügt über zwei Attribute, groesse und gewicht. Die Klasse Katze hat ein Attribut für name der Katze und eines für die Messung. Und in einer Start-Klasse mit dem Namen App haben wir zunächst mal eine Liste von Katzen erzeugt, hier, und anschließend haben wir die Katzenlisten in unterschiedlichen Varianten sortiert, abgeändert und ausgegeben. Hier sehen Sie also, gebe die Katzen sortiert nach Name aus, dann gebe die Katzen sortiert nach der Größe aus, und so weiter. Hier haben wir das Comparable benutzt, darunter den comparator, weil es sich nicht um das Natural Ordering handelte. Darunter haben wir dann die größte Katze ausgegeben. Und hier haben wir die groessteKatze entfernt und das Ganze nochmal ausgegeben. Wenn Sie sich hierfür interessieren, dann schauen Sie sich das letzte Video vom letzten Kapitel an. Gut, jetzt können wir das gleiche mit der Stream API machen. Und zwar werden Sie sehen, dass wir hierbei noch viel effizienter und prägnanter programmieren können. Als die Stream-API mit Java 8 in Java SE hinzugekommen ist, mussten einige Erweiterungen hierfür eingebaut werden. Denn damit beispielsweise die Klassen der Collection API von Java als Stream verwendet werden können, hat Java eine Default Methode mit dem Namen Stream in das Interface Java Util Collection eingebaut. Und diese Methode rufe ich jetzt gleich auf, indem ich das Objekt Katzen gleich wieder aufschreibe und dahinter den Punkt-Operator setze. Ich entferne also diese beiden Anweisungen, mit denen ich die Katzen sortiert nach Namen ausgegeben habe, schreibe dort katzen hin und füge den Punkt-Operator hinzu und dann sehen Sie hier alle Methoden des Interfaces List und ganz hier unten sehen Sie dann die Methode Stream. Der Rückgabewert dieser Methode ist ein generischer Stream, der den Typ-Parameter Katze enthält. Das sehen Sie hier. Stream ist ein Interface, das im Programmpaket Java Util Stream enthalten ist. Da steht es uns bei allen Interfaces und Klassen aus der Collection API automatisch zur Verfügung. Dieses Interface cuttet die wesentliche Funktionalität der Stream API. Deshalb rufe ich im nächsten Schritt die Methode Stream jetzt auf. Wenn ich mit der Maus über die Methode Stream fahre, dann sehen Sie, dass uns die Methode ein Objekt des Intefaces stream liefert und bei diesem Objekt ist dann der Typ- Parameter mit einer Katze parametrisiert. Was nun hinter den Kulissen passiert ist, dass die gesamte Datenreihe in eine spezielle Stream-Leitung kopiert wird. Hierbei muss man wissen, dass die Original-Elemente der Collection überhaupt nicht verändert werden, sondern stets mit der Kopie gearbeitet wird. Wenn ich nun einen Punkt-Operator hinter die Methode Stream setze, dann sehen Sie im Kontextmenü, dass das Interface eine Vielzahl an Methoden anbietet, mit denen die Elemente der Datenreihe weiterverarbeitet werden können. Die Methode count gibt die Anzahl der Elemente im Stream wieder. Mit allMatch kann ich über ein Predicate ermitteln, ob alle Elemente in einem Stream einer bestimmten Prüfbedingung entsprechen. Das Ergebnis ist ein Boolean. Die Methode anyMatch prüft, ob mindestens eines der Elemente der Prüfbedingung entspricht. Auch hier ist die Übergabe ein Predicate und ich erhalte ein Boolean zurück. Mit der Methode collect kann ich mir aus dem Stream eine Collection mit der Ergebnismenge besorgen. Die Methode distinct schmeißt die redundanten Elemente aus dem Stream heraus, sodass jedes Element nur einmal in der Datenreihe enthalten ist. Die Methode filter sorgt dafür, dass nur die Elemente im Stream erhalten bleiben, die einer bestimmten Bedingung entsprechen. Die Methode findFirst besorgt das erste Element aus dem Stream. Das Ergebnis ist ein Objekt des Typs optional, das das Element umwickelt. Die Methode findAny ähnelt der Methode Find First, sie besorgt aber nicht das erste, sondern irgendein Element aus der Datenreihe. Diese Methode wird also dann eingesetzt, wenn im Stream lediglich ein einziges Element enthalten ist. Hier sehen Sie auch noch eine wichtige Methode, die nennt sich map, mit der wir aus dem ausgehenden Stream einen neuen Stream erhalten, bei dem die neuen Elemente gemäß einer neuen Implementierung geliefert werden. Die Methode map erwartet Rückgabe-Parameter des Typs Function. Als Rückgabewert liefert sie einen Stream, bei dem die Elemente aus der Ergebnismengegebildet werden können. Dies war jetzt nur eine kleine Übersicht, über die wichtigsten Methoden eines Streams, auf die wir auch gleich nochmal zurückkommen. Wir Sie also sehen, liefern die Methoden in der Regel selbst einen Stream zurück, sodass sie sich hintereinander verketten lassen. Der englische Fachbegriff hierfür lautet Method Chaining. Dies werde ich Ihnen gleich in diesem Beispiel zeigen. Denn die Method Chaining geht schon hier mit der Methode Stream los. Gleich nach der Methode Stream können wir direkt schon die nächste Methode aufrufen, die auch wieder schon einen Stream liefert. Wir müssen uns nun bloß unter den Stream-Methoden für die richtige Methode entscheiden. Wir wollen die Katzen ja sortiert ausgeben, also suche ich nach einer Methode, mit der ich den Stream sortieren kann. Ich gehe also in die Liste weiter runter und hier sehe ich zwei Methoden, die sich sorted nennen und die erst, die wird mir dann die Liste sortieren und zwar nach dem Natural Ordering. Der Rückgabewert der Methode sorted ist auch wieder ein Stream von Katzen. Deshalb füge ich wieder einen Punkt-Operator hinzu. Denn jetzt selektiere ich die Methode forEach, mit der ich die sortierte Liste der Katzen ausgebe. Als Übergabe-Parameter wird ein Consumer erwartet. Ich kann also auch hier wieder mit der Method- Reference System.out ; ; println arbeiten. Kommen wir nun zum nächsten Fall, wo wir die Katzen sortiert nach der Größe ausgeben lassen wollen. Auch diese Aufgabe lässt sich mit einereinzelnen Stream Anweisung realisieren. Auch hier nennt sich die Methode Sorted. Ich entferne also diese beiden Anweisungen, mit der wir das gleiche Problem zuvor gelöst hatten. Ich schreibe dann Katzen hin und dann stream und jetzt besorge ich wieder eine Methode sorted aber eine überladene Methode, die als Übergabe-Parameter einen Comparator erwartet. Und auch Diese Methode liefert dann einen Stream zurück und auch hier kann ich deswegen dann eben die forEach Methode aufrufen, die auch wieder einen Consumer erwartet, wofür ich auch dort wieder die Method-Reference System.out: : println ausführen. So, mit diesen beiden Aufgaben sind wir erstmal fertig. Ich probiere das Beispiel mal aus und jetzt sehen Sie, dass die Ausgabe genauso erfolgt, von diesen ersten Zehn Zeilen, wie wenn wir ohne Streams gearbeitet haben, nur, dass wir uns jetzt wesentlich knapper und prägnanter ausdrücken konnten. In diesem Video habe ich Ihnen die Functional Stream API vorgestellt. Anschließend habe ich Ihnen gezeigt, wie wir die vorhandenen Anweisungen mit Hilfe der funktionalen Stream API verkleinern können. Was man bei der funktionalen Stream API nicht vergessen darf ist, dass die gesamte Datenreihe in eine spezielle Stream Line kopiert wird und die originale nicht verändert werden, sondern stets mit der Kopie gearbeitet wird.

Java Grundkurs 3: Generische Programmierung, Datenströme, Datumsrechnung

Steigen Sie tiefer in die Java-Programierung ein und lernen Sie den Umgang mit generischen Typen, Lamda-Ausdrücken, DAtenströmen und mit Datums- und Zeitberechnung.

5 Std. 24 min (47 Videos)
Derzeit sind keine Feedbacks vorhanden...
 
Hersteller:
Software:
Exklusiv für Abo-Kunden
Erscheinungsdatum:09.10.2016

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!