Am 14. September 2017 haben wir eine überarbeitete Fassung unserer Datenschutzrichtlinie veröffentlicht. Wenn Sie video2brain.com weiterhin nutzen, erklären Sie sich mit diesem überarbeiteten Dokument einverstanden. Bitte lesen Sie es deshalb sorgfältig durch.

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

Stream API - Methoden und Klassen für Fortgeschrittene

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Wagen Sie mit diesem Video einen tiefen Sprung in die Stream API! In diesem Video führt Ihnen der Trainer zahlreiche Stream-Methoden vor. Außerdem lernen Sie die Klasse Optional kennen, die ein Stream als Rückgabewert seiner Methoden einsetzt, wenn die Gefahr besteht, ansonsten eine NullPointerException auszulösen.

Transkript

Ein Grundverständnis für die funktionale Stream API haben Sie bereits gewonnen und nun möchten Sie einen tiefen Sprung in die Stream API wagen? Dann sind Sie bei diesem Video richtig. In diesem Video steigen wir etwas tiefer in die funktionale Stream API ein. Denn nun lösen wir den nächsten Fall, bei dem wir die Größe der größten Katze auf der Konsole ausgeben. Hierfür müssen wir etwas tiefer in die Trickkiste der funktionalen Stream API hineingreifen. Außerdem gibt es bei der Stream API häufig auch mehrere Möglichkeiten, wie ein Problem gelöst werden kann. Aber schauen wir uns erstmal an, was wir mit den Streams nun optimieren können. In dem bisherigen Quelltext haben wir uns ja die Katze, die die größte Größe hat, mit der Methode Max herausgesucht. Und zwar hier. Da haben wir die Methode max aufgerufen. Nun, eine ähnliche Methode existiert auch in einem Stream. Ich schreibe auch hier wieder die Variable Katzen hin, setze die Punkt Operator, rufe stream auf. Dann erhalte ich einen Stream und jetzt kann ich auf den stream die Methode max aufrufen. Und auch die Methode max erwartet einen Comparator. Das Besondere hierbei ist, dass der Rückgabewert kein Objekt des Typs Katze, sondern ein Objekt des Typs Optional mit Typ Parameter Katze ist. Bei einem Optional handelt es sich um eine Art Behälter, bei dem eigentliche Wert enthalten sein kann oder eben auch nicht. Um detailliert auf das Optional einzugehen, übergebe ich es erstmal einer Variablen. Ich deklariere eine Variable namens optional und dann füge ich das Gleichheitszeichen hinzu, wandere mit der Maus über die Variable, lasse mir von Eclipse helfen, wähle den ersten Eintrag des Kontextmenüs Create local variable optional. So und dann sehen Sie hier die Klasse Optional mit Hilfe der Klasse Optional macht Java deutlich, dass der eigentliche Wert, den wir erwarten nicht zwingend vorhanden sein muss. Diese Neuerung von Java 8 ist für die Streaming API von Bedeutung, da wir keine Referenz auf null, sondern auf ein wirkliches Objekt erhalten. Nun könnte man auf die Idee kommen, dass uns Java hiermit endlich etwas anbietet, womit wir einer null Pointer Exception für immer aus dem Weg gehen könnten. Denn werden nicht alle automatisch mit null belegt und könnte man nicht überall da, wo eine null gesetzt wird, ein Optional vorsehen? Wäre das also nicht eine Vorkehrung, die man in all seinen Modellklassen endlich grundsätzlich vorsehen könnte? Aber das wäre leider eine Zweckentfremdung der Klasse Optional, denn dies war nicht das, was die Mitglieder der Java Expert Group bezweckten. Und außerdem ist es auch fatal so vorzugehen, denn die Verwendung der Klasse Optional führt zu einem großen Overhead und verlangsamt das Programm im Laufzeitverhalten ganz erheblich. Außerdem ist die Klasse Optional nicht sehr realisierbar und liefert manchmal darüber hinaus nicht vorhersehbare Ergebnisse, wenn man optional Objekte über den Gleichheitsoperator miteinander vergleich. Und in vielen Situationen kann die Klasse Optional als richtige Wahl sogar ganz ausgeschlossen werden. Beispielsweise sollte sie nicht für oder Übergabeparameter eingesetzt werden. Selbst als Rückgabewert einer Methode ist die Klasse Optional nur in bestimmten Fällen die richtige Wahl. Beispielsweise sollte ein Array oder eine Collection nicht mit dem Optional Behälter als Rückgabewert zurückgegeben werden, sondern ein leeres Array oder eine leere Collection sollte verwendet werden. Die Klasse Optional sollte also sehr behutsam eingesetzt werden. Mit anderen Worten, es reduziert sich die Verwendung der Klasse Optional auf wenige Fälle. Aber für solche Fälle wiederum bietet die Klasse Optional auch wieder Vorteile. Kommen wir also zurück zu unserem Stream. Die Methode Max gibt uns also eine Objekt des Typs Optional zurück, weil es nicht davon ausgehen kann, dass die Methode Max ein Ergebnis liefert. Nun gut. Dann schauen wir uns jetzt an, wie es weitergeht, denn schließlich möchten wir ja die Größe der größten Katze ausgeben. Ich verwende also die Variable Optional und gebe den Punkt Operator ein und jetzt sehen Sie, welche Methoden wir zur Verfügung haben, um weiter fortzufahren. Um den eigentlich Wert, das heißt in unserem Fall die Katze zu erhalten. Bietet uns ein Optional vier Methoden an. Dies sind die Methode get, dann die Methode orElse, die Methode orElseGet und orElseThrow. Mit der Methode get könnten wir uns das Katzenobjekt besorgen und dahinten könnten wir mit Get Messungen und Get Größen, die Größe der Katze besorgen. Und das versuchen wir jetzt auch mal, .getMessung. Das ist ja eine Methode, die in der Klasse Katze enthalten ist und somit nach dem get verwendbar ist und nach getMessung erhalten wir ein Objekt des Typs Messung und dort können wir dann eben die Methoden einer Messung benutzen und hier ist es die Methode getgroesse, die uns die Größe der Katze liefern wird. Bei uns würde das funktionieren, denn in unserem Programmierbeispiel ist es aus dem Quelltext heraus klar ersichtlich, dass das Optional einen gültigen Wert enthält. Wenn Java aber keinen Wert vorfindet, wirft die getMethode eine No Such Element Exception aus. Und es gibt in der Praxis bestimmt eher viele Fälle, wo es nicht so eindeutig ist. Bei der Or Else Methode, dieser hier, können wir für solch einen Fall einen Default Wert hinterlegen, der im Fall eines leeren Optionals ersatzweise übergeben wird. Also das wäre dann so Or Else und hier müsste ich dann beispielsweise eine new Katze reinsetzen und dann auch wieder getMessung.getgroesse aufrufen. Diese Methode könnten wir also zur Sicherheit verwenden, weil wir vielleicht davon ausgehen, dass uns die Methode Get eine Referenz auf null liefern würde und wir also an dieser Stelle eine null Pointer Exception erhalten würden. Aber die Methode or Else macht in unserem Fall genauso wenig Sinn, weil Messung und groesse ebenso erstmal mit einem wirklichen Objekt initialisiert werden müssten. Schauen wir uns also an, was noch existiert. Dann hatten wir noch gesagt, es gibt die Methode orElseGet, der wir einen Supplier übergeben. Aber orElseGet ist ähnlich wie Or Else, ermöglicht aber eben, dass ein Supplier für Ersatz sorgt. Diese Methode käme dann in unserem Fall vielleicht noch eher in Betracht. Und dann gibt es ja noch die Methode orElseThrow, die schauen wir uns dann auch noch an. orElseThrow und wie wir schon vermuten können, wirft die Methode orElseThrow bei einem fehlenden Objekt eine Exception aus. Und auch diese Methode eignet sich also kaum. Aber die Klasse Optional bietet noch andere Möglichkeiten, die uns an dieser Stelle eher weiterhelfen. Denn Optional verfügt über eine Methode, die sich Map nennt, wobei es besonders ist, dass die enthaltenen Werte überhaupt nicht mit Objekten initialisiert sein sollen. Der Methode Map übergebe ich ein Functional Interface des Typs Function. Das sehen Sie hier, das wiederum für die Beschaffung eines neuen Optionals zuständig ist. Hier kann ich also einen Lambda-Ausdruck für die der mir die Messung der Katze liefert. Dies mache ich jetzt, indem ich die Methode-Referenz Katze Doppel Colon Operator Get Messung als Übergabe Parameter mitgebe, also gehe ich hier in die runden Klammern rein und schreibe dort rein Katze : : getMessung. Was nun passiert ist, dass innerhalb des Optionals die Katze hervorgeholt wird und bei ihr die Methode getMessung ausgeführt wird. Wenn es sich bei dem Ergebnis um ein Objekt handelt, so wird es in einen optional Behälter gesteckt und als Rückgabewerte geliefert. Und wenn der Rückgabewert auf null referenziert, so wird ein leerer optional Behälter zurückgegeben. Wir erhalten also in jedem Fall ein gültiges Optional Objekt, mit dem wir per Method Chaining weiterarbeiten können. Das Optional, das wir erhalten, ist ja als Behälter für Messungsobjekte ausgelegt. Daher können wir auch jetzt wieder die Methode Map ausführen. .map und auch hier können wir als Übergabe Parameter wieder ein Function übergeben und deswegen können wir auch dort wieder mit einer Method-Reference nach enthaltenen Eigenschafts-Feldern suchen. Beispielsweise wird uns die messung : : operator Get Größe auch wieder ein gültiges Optional liefern. Und auch in diesem Optional ist entweder ein gültiges Objekt oder auch eben gar nichts enthalten. Aber in jedem Fall handelt es sich um ein gültiges Optional. So und nun rücke ich die Methoden etwas untereinander ein, damit unsere Programmierung besser lesbar wird. So und weiter geht’s. Als nächstes könnten wir uns den Inhalt dieses Optionals, das uns beschafft worden ist besorgen und dort die Methode get Or Else, Or Else get oder Or Else Throw aufrufen, um uns den eigentlichen Wert der Größe zu beschaffen. Aber das wäre ja riskant. Stattdessen rufe ich die Methode ifPresent auf. Also dort Punkt Operator ifPresent. Und ifPresent erwartet einen Consumer. Und den übergebe ich ihr und zwar System.out : : println. Also die Method-Reference auf System.out.println und das wird uns dann die Größe der Katze ausgeben, aber auch nur, wenn die Größe tatsächlich vorhanden ist und dort kein null Wert referenziert wird. In diesem Video haben wir einen tiefen Sprung in die funktionale Stream API gewagt. Dabei habe ich Ihnen zahlreiche Stream Methoden gezeigt. Außerdem habe ich Ihnen die Klasse Optional vorgestellt, die der Stream als Rückgabewert seiner Methoden einsetzt, wenn er in Gefahr läuft sonst eine null Pointer Exception auszulösen.

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!