Video: Java-Übung 10 (SS 2019): Funktionale Programmierung, Lambda-Ausdrücke, Streams 2024
Java verfügt über ausgefallene Methoden, die Streams und Lambda-Ausdrücke optimal nutzen. Mit Streams und Lambda-Ausdrücken können Sie eine Fließband erstellen. Die Fließbandlösung verwendet Konzepte der funktionalen Programmierung.
Die Montagelinie besteht aus mehreren Methoden. Jede Methode übernimmt die Daten, transformiert die Daten auf die eine oder andere Art und gibt ihre Ergebnisse an die nächste Methode in der Reihe weiter. Hier ist eine Montagelinie.
Jede Schachtel repräsentiert eine Reihe von Rohmaterialien, während sie entlang einer Montagelinie umgewandelt werden. Jeder Pfeil stellt eine Methode dar (oder metaphorisch einen Arbeiter in der Fertigungsstraße).
Beim Übergang vom zweiten zum dritten Feld sortiert beispielsweise eine Worker-Methode (die
-Filter
-Methode) Verkäufe von Elementen aus, die keine DVDs sind. Stellen Sie sich vor, dass Lucy Ricardo zwischen der zweiten und dritten Kiste steht, jedes Buch oder jede CD aus dem Fließband entfernt und es achtlos auf den Boden wirft.
Der Parameter für die
-Filter
-Methode von Java ist ein
-Prädikat
- ein Lambda-Ausdruck, dessen Ergebnis
boolesch
ist. Die
-Filter
-Methode sortiert Elemente aus, die den
true / false
-Test des Lambda-Ausdrucks nicht bestehen.
Methodenname | Member von | Parameter | Ergebnistyp | Ergebniswert |
stream
|
Sammlung
(z. B.
ArrayList
, Objekt) |
(keiner) |
Stream
|
Ein Stream, der Elemente der Sammlung ausspuckt |
Filter
|
Stream
|
Prädikat
|
Stream > Ein neuer Stream mit Werten, für die der Lambda-Ausdruck
|
true zurückgibt
map
|
Stream
|
Funktion
|
Stream
|
Ein neuer Stream mit den Ergebnissen der Anwendung des Lambda-Ausdrucks auf den eingehenden Stream
|
reduce |
Stream
|
BinaryOperator
|
Der vom
|
BinaryOperator
verwendete Typ Das Ergebnis der Kombination aller Werte im eingehenden Stream
|
|
map
-Methode) den
-Preis
aus jedem
Verkauf
. Ab diesem Arbeitsplatz enthält die Montagelinie nur
Preis
-Werte.
Um genauer zu sein, benötigt die
map
Methode von Java eine
Funktion
wie
(Verkauf) -> Verkauf. getPrice ()
und wendet die
-Funktion
auf jeden Wert in einem Stream an. Die
map
-Methode verwendet also einen eingehenden Stream von
sale
-Objekten und erstellt einen abgehenden Stream mit
price
-Werten.
Beim Übergang von der vierten in die fünfte Box addiert eine Worker-Methode (die
reduce
-Methode) die Preise für DVD-Verkäufe zusammen.Die Methode
reduce
von Java benötigt zwei Parameter:
Der erste Parameter ist ein Anfangswert.
Im obigen Bild ist der Anfangswert
0. 0
.
Der zweite Parameter ist ein
BinaryOperator
.
Im obigen Bild ist der
-Methode des
-Moduls
BinaryOperator
ist
(price1, price2) -> price1 + price2
Die
reduce
-Methode verwendet seinen
BinaryOperator
, um die Werte aus dem eingehenden Stream zu kombinieren. Der Anfangswert dient als Ausgangspunkt für alle Kombinationen. Die Methode
reduce
führt also zwei Additionen aus.
Stellen Sie sich zum Vergleich vor, dass Sie die Methode
aufrufen, um (10. 0, (value1, value2) -> value1 * value2)
mit dem Stream zu ersetzen, dessen Werte
3 enthalten. 0
,
2. 0
und
5. 0
. Die resultierende Aktion wird unterhalb von
Sie haben vielleicht schon von Googles MapReduce-Programmiermodell gehört. Die Ähnlichkeit zwischen dem Namen des Programmiermodells und den Java-Methodennamen
map
und
reduce
ist kein Zufall.
Insgesamt betrachtet werden die Preise der verkauften DVDs durch die gesamte Montage erhöht. Der obige Code enthält ein vollständiges Programm, das die Streams und Lambda-Ausdrücke das erste obige Bild verwendet.
importiert Java. Text. Zahlenformat;
importiert Java. Nutz. Anordnungsliste;
öffentliche Klasse TallySales {
public static void main (String [] Argumente) {
ArrayList
NumberFormat currency = Zahlenformat. getCurrencyInstance ();
fillTheList (Verkäufe);
doppelte Summe = Umsatz. stream ()
. filter ((verkauf) -> verkauf. getItem (). equals ("DVD"))
. Karte ((Verkauf) -> Verkauf. getPrice ())
. reduzieren (0, 0, (Preis1, Preis2) -> Preis1 + Preis2);
System. aus. println (Währung. Format (gesamt));
}
static void fillTheList (ArrayList
Verkäufe. add (neuer Sale ("DVD", 15. 00));
Umsatz. add (neuer Sale ("Book", 12. 00));
Umsatz. add (neuer Verkauf ("DVD", 21. 00));
Umsatz. add (neuer Verkauf ("CD", 5. 25));
}
}
Der Code erfordert Java 8 oder höher. Wenn Ihre IDE für eine frühere Java-Version eingestellt ist, müssen Sie möglicherweise mit den Einstellungen der IDE herumspielen. Sie müssen möglicherweise sogar eine neuere Version von Java herunterladen.
Die Fettschrift ist eine große Java-Zuweisungsanweisung. Die rechte Seite der Anweisung enthält eine Sequenz von Methodenaufrufen. Jeder Methodenaufruf gibt ein Objekt zurück, und jedes solche Objekt ist das Ding vor dem Punkt im nächsten Methodenaufruf. So bilden Sie die Montagelinie.
Beispielsweise verweist der Name
sales
in der Nähe des Beginns des Fettdruckcodes auf ein
ArrayList
-Objekt. Jedes
ArrayList
-Objekt verfügt über eine
Stream
-Methode. Im obigen Code
Umsatz. stream ()
ist ein Aufruf der
ArrayList
Objekt
Stream
Methode.
Die stream-Methode gibt eine Instanz der
Stream
-Klasse von Java zurück. (Was für eine Überraschung!) So
Umsatz. stream ()
bezieht sich auf ein
Stream
-Objekt.
Jedes
Stream
Objekt hat eine
Filter
Methode. Also
Umsatz. Strom(). filter ((Verkauf) -> Verkauf. getItem (). equals ("DVD"))
ist ein Aufruf der
Filter
Methode des
Stream
Objekts.
Das Muster wird fortgesetzt. Die
map
-Methode des
Stream
-Objekts gibt ein weiteres
Stream
-Objekt zurück - ein
Stream
-Objekt mit Preisen.
Zu diesem
Stream
der Preise wenden Sie die Methode
reduce
an, die einen
doppelten
Wert ergibt - die Summe der DVD-Preise.