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

Consumer und BiConsumer

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
In diesem Video lernen Sie die vordefinierten Functional Interfaces Consumer und BiConsumer kennen. Diese Functional Interfaces nehmen Übergabeparameter entgegen, geben aber keinen Rückgabewert zurück. Ein typischer Anwendungsfall dafür ist beispielsweise ein Mechanismus, der einen Text auf die Konsole schreibt.

Transkript

In diesem Video lernen Sie die vordefinierten Functional Interfaces Consumer und BiConsumer kennen. Diese Functional Interfaces nehmen Übergabe Parameter entgegen, geben aber keinen Rückgabe-Wert wieder. Ein typischer Anwendungsfall für solch ein Functional Interface ist beispielsweise ein Mechanismus, der einen Text auf die Konsole hinausschreibt oder auf den Drucker schickt Deshalb können wir beispielsweise unsere System.out.println Anweisung mit einem solchen Lambda-Ausdruck ersetzen. Zunächst definiere ich eine lokale Variable mit dem Functional Interface Consumer. Beispielsweise hier unten. Nach BinaryOperator schreibe ich dann Consumer hin. Den Typ-Parameter parametrisiere ich mit dem Datentyp String. Jetzt brauche ich eine Variable und die nenne ich mal drucker. So und jetzt weise ich dem Drucker einen Lambda-Ausdruck zu. Ich kann es mir aber auch noch einfacher machen, indem ich den Ausdruck System.out.print als Method-Reference angebe. Das werde ich so tun. Also System, dann den Punkt-Operator, um auf die Klassen-Variable out zuzugreifen. Dann : :print;. Consumer muss ich importieren und bin dann mit der Deklaration und der Initialisierung meines Druckers fertig. Und hier sehen Sie jetzt etwas Neues. Denn zunächst beschaffe ich mir über den Punkt-Operator die Klassenvariable out und erst dahinter verweise ich mit dem Double-Colon Operator auf die Klassen-Methode print. Das Besondere hierbei ist, dass es sich bei der Klassenmethode print in der Klasse Print Stream über eine überladene Methode handelt, die normalerweise unterschiedliche Übergabeparameter entgegennehmen kann. Jedoch entscheide die Parametrisierung darüber, um welchen Datentypen es sich handelt. Also welche Methode dann ausgewählt wird. Und auch das ist ein Automatismus, der sich sehr intuitiv anfühlt, wenn man ihn mal verstanden hat. Jetzt muss ich die Ausgabe-Anweisung hier unten noch abändern. Ich rufe also den Drucker auf und führe die Methode accept aus und übergebe ihr eine Zeichenkette bmi: und konkateniere ganz einfach den Wert bmi. So und das Programm speichere ich ab und probiere es auch einmal aus. Und dann sehen Sie, gut, dass mir die ganzen Nachkommastellen angezeigt werden, weil ich nicht mehr mit printF arbeite. Aber das Prinzip ist klar. Das funktioniert also soweit. Auch die printF Anweisung hätten wir auf die gleiche Weise einsetzen können. Aber die Methode printF erwartet eigentlich mindestens zwei Parameter, um sinnvoll eingesetzt zu werden. Aber auch hierfür bietet die Java-Standardbibliothek mit einem Functional Interface, das sich BiConsumer nennt, eine Lösung an. Deshalb werde ich auch dieses Functional Interface mal einsetzen, um mir einen zweiten Drucker zu erschaffen. Ich deklariere also eine Variable vom Typ BiConsumer und bei dem ersten Typ-Parameter setze ich einen String für die Parametrisierung ein. Bei dem zweiten Typ-Parameter setze ich ein Double ein. Die Variable nenne ich drucker2. Und dieser Variablen weise ich nun wieder eine Method-Reference zu. Und zwar System.out::printf. Und jetzt kann ich die Variable drucker2 hier unten mal nutzen. Also füge ich dort eine 2 hinter dem Bezeichner Drucker und jetzt funktioniert natürlich meine Methode accept so nicht mehr. Ich brauche jetzt zwei Übergabeparameter und zwar setze ich bei dem ersten das Template ein. BMI: %f für die eine Nachkommastelle. So und dann brauche ich den zweiten Übergabeparameter und das ist ja bmi. So und das speichere ich ab und probiere das Programm einmal aus. So und dann sehen Sie, dass mir hier wieder nur noch eine Nachkommastelle angezeigt wird. Das Programm funktioniert also einwandfrei. Die Java-Standard-Bibliothek bietet also zwei Consumer Varianten an, mit denen wir einen oder zwei Parameter übergeben können. Abschließend werde ich unser Beispielprogramm auch noch etwas erweitern um die beiden Functional Interfaces Consumer und BiConsumer auch noch in einem etwas komplexeren Kontext vorzuführen. Unsere Aufgabe wird es sein erstmal die Groesse der Katze Pinki über die Konsole einzulesen. Anschließend sollen in einer Schleife wiederholt Gewichte eingelesen werden. Jedes Mal, wenn ein Gewicht eingelesen worden ist soll der BMI-Wert berechnet und ausgegeben werden. Bei der Eingabe einer -1 sollen die Schleifendurchgänge abgebrochen werden und das Programm beendet werden. Legen wir also los. Grundsätzlich gibt es natürlich auch eine ganze Menge anderer Möglichkeiten, wie wir dieses Programm realisieren könnten, aber werden einen ganz einfachen Weg gehen. Zunächst werde ich mir eine Instanz der Klasse Scanner besorgen. Die Deklaration werde ich in einem Try With Resources Ausdruck vornehmen. Ich beginne also mit dem Try With Resources Block. In den runden Klammern deklariere ich einen Scanner. Den nenne ich scanner und dem weise ich ein neues Objekt zu des Typs Scanner. Und hier muss dann System.in drinstehen in dem Constructor, damit ich vom Benutzer die Eingaben einlesen kann. Und jetzt habe ich den try-Block so und in dem Try-Block werde ich den Benutzer dann darauf hindeuten, dass er mir die Groesse eingeben soll. Also drucker.accept und hier drin dann als Übergabe-Parameter Groesse. Das wird dann diese Zeichenkette auf der Konsole ausgeben und danach lese ich die Groesse ein. Und zwar brauche ich zunächst mal eine variable Groesse und den scanner weise ich an über nextDouble, lies ein Double Wert ein. So und jetzt benötige ich eine Endlosschleife. Denn ich möchte, dass der Benutzer mehrere Gewichte eingeben kann. Also, while (true) und hier drin innerhalb der Schleife fordere ich den Benutzer auf ein Gewicht für die Katze einzugeben. Dabei setze ich wieder den gleichen Drucker ein Also drucker.accept und hier drin dann Gewicht: und hier lese ich dann das Gewicht der Katze ein. Double gewicht = wieder der Scanner mit nextDouble. Das wird mir dann das Gewicht als Double zurückliefern. So und wenn der Benutzer ein negatives Gewicht eingeben sollte, dann sollten alle Eingaben beendet werden. Deswegen werde ich dort ein if hinzufügen. if(gewicht) < 0,0 einfach, dann sollen die Schleifendurchläufe abgebrochen werden, also break. Hierdurch ist dann alles beendet. Ja und die eingegebene Größe und das eingegebene Gewicht werde ich dann der Methode Apply übergeben damit die Berechnung des BMI-Werts durchgeführt wird, bei dem Rechner. Das ist ja der hier oben, der BMIRechner. Jetzt muss ich mal diese beiden Anweisungen einfach von da unten herausschneiden und in die While-Schleife hinzufügen. So und die Größe und das Gewicht das ist natürlich jetzt hier kein fester Wert, den ich der Methode Apply übergeben muss, sondern hier soll dann natürlich ganz dynamisch die Groesse und das gewicht hinzugefügt werden, das der Benutzer soeben eingegeben hat. Und ansonsten bin ich mit meinem Programm ganz zufrieden. Das speichere ich mal ab und probiere es auch einmal aus. Also, ich drück auf Play, gebe dann eine Groesse ein, 0,51 dann das Gewicht: 6,1 und dann erhalte ich hier den BMI-Wert. Jetzt habe ich hier noch ein Problem und zwar möchte ich ja das genau an dieser Stelle zu einer neuen Zeile gesprungen wird. Das ist genau dort. Deswegen brauche ich in dem Template ein %n. So, das probiere ich jetzt erneut aus, Play. Die Groesse der Katze ist 0,51, dann brauche ich das Gewicht: 6,1. Der BMI-Wert ist dann 23,5. Dann gebe ich noch ein Gewicht ein, 6,2. Dann habe ich einen höheren BMI-Wert. Jetzt kann ich das Ganze mit -1 abbrechen. In diesem Video habe ich Ihnen die vordefinierten Functional Interfaces Consumer und BiConsumer vorgestellt. Der Unterschied zwischen diesen beiden Functional Interfaces ist dass der Consumer einen und der BiConsumer zwei Übergabe-Parameter entgegennimmt.

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!