Video: Week 9 2024
Java har fina metoder som optimalt utnyttjar strömmar och lambda-uttryck. Med strömmar och lambda-uttryck kan du skapa en monteringslinje. Assembly-line-lösningen använder koncept från funktionell programmering.
Monteringsledningen består av flera metoder. Varje metod tar data, omvandlar data på något sätt, och händer resultaten till nästa metod i rad. Här är en monteringslinje.
Varje låda representerar en massa råvaror eftersom de omvandlas längs en monteringslinje. Varje pil representerar en metod (eller, metaforiskt, en arbetare på samlingslinjen).
I övergången från den andra rutan till den tredje rutan slocknar en arbetarmetod (metoden
filter
) försäljningen av objekt som inte är DVD-skivor. Tänk dig att Lucy Ricardo står mellan andra och tredje lådorna och tar bort varje bok eller cd från samlingslinjen och slänger den slarvigt på golvet.
Parametern till Java
filter
är en
Predikat
- ett lambda-uttryck vars resultat är
boolean
. Metoden
filter
skär ut objekt som inte passerar lambda-uttryckets
true / false
-test.
Metodnamn | Medlem av | Parameter (s) | Resultattyp | Resultatvärde |
ström
|
Samling
(till exempel en
ArrayList
, objekt) |
(ingen) |
Stream
|
En ström som spetsar ut element i samlingen |
filter
|
Stream
|
Predikera
|
Stream > En ny ström som innehåller värden för vilka lambda-uttrycket returnerar
|
true
map
|
Stream
|
Funktion
|
Stream
|
En ny ström som innehåller resultaten av att använda lambda-uttrycket i den inkommande strömmen
|
minska |
Stream
|
BinaryOperator
|
Typen som används av
|
BinaryOperator
Resultatet av att kombinera alla värden i den inkommande strömmen
|
|
karta
)
pris
ut ur varje
försäljning
. Från den anställdes plats framåt innehåller samlingslinjen endast
pris
värden.
För att vara mer exakt tar Java
map
-metoden en
Funktion
som
(försäljning) -> försäljning. getPrice ()
och tillämpar
Funktionen
för varje värde i en ström. Så tar metoden
map
en inkommande ström av
försäljning
objekt och skapar en utgående ström av
pris
-värden.
I övergången från den fjärde rutan till den femte rutan lägger en arbetarmetod (metoden
reducera
) priserna på DVD-försäljningen.Java
reducera
-metoden tar två parametrar:
Den första parametern är ett initialvärde.
I bilden ovan är initialvärdet
0. 0
.
Den andra parametern är en
BinaryOperator
.
I bilden ovan är
reducera
metoden
BinaryOperator
(pris1, pris2) -> pris1 + pris2
Metoden
minska
använder sin
BinaryOperator
för att kombinera värdena från den inkommande strömmen. Det ursprungliga värdet tjänar som utgångspunkt för all kombination. Så, metoden
reducerar
gör två tillägg.
Reduktionsmetoden lägger till två värden från en inkommande ström.
minska (10, 0, (värde1, värde2) -> värde1 * värde2)
med strömmen vars värden inkluderar
3. 0
,
2. 0
och
5. 0
. Den resulterande åtgärden visas nedan
Reduktionsmetoden multiplicerar värden från en inkommande ström.
map
och
minska
är inte en slump.
Sammanfattningsvis uppgår hela sammansättningen till priserna på DVD-skivor som säljs. Koden ovan innehåller ett komplett program med hjälp av strömmarna och lambda-uttrycken den första bilden ovan.
importera java. text. Number;
importera java. util. Arraylist;
public class TallySales {
statisk statisk tomt huvud (String [] args) {
ArrayList
sales = new ArrayList <> ();
fillTheList (försäljning);
dubbel total = försäljning. ström ()
. filter ((försäljning) -> försäljning. getItem (). motsvarar ("DVD"))
. karta ((försäljning) -> försäljning. getPrice ())
. minska (0, 0, (pris1, pris2) -> pris1 + pris2);
System. ut. println (valuta. format (totalt));
}
statisk void fillTheList (ArrayList
försäljning) {
försäljning. lägg till (ny försäljning ("bok", 12.00));
försäljning. lägg till (ny försäljning ("DVD", 21.00));
försäljning. lägg till (ny försäljning ("cd", 5, 25));
}
}
Koden kräver Java 8 eller senare. Om din IDE är inställd för en tidigare Java-version kanske du måste tinker med IDE: s inställningar. Du kan till och med behöva ladda ner en nyare version av Java.
Det djupa fältet är ett stort Java-uppdragsdeklaration. Den högra sidan av uttalandet innehåller en sekvens av metodsamtal. Varje metodanrop returnerar ett objekt, och varje sådant objekt är saken före pricken i nästa metodsamtal. Så bildar du monteringslinjen.
Till exempel, nära början på fetstilkoden, heter namnet
försäljning
ett
ArrayList
objekt. Varje
ArrayList
-objekt har en
ström
-metod. I koden ovan,
försäljning. stream ()
är ett samtal till det
ArrayList
objektets
ström
-metod.
Strömmetoden returnerar en instans av Java: s
Stream
-klass. (Vad en överraskning!) Så
försäljning. ström ()
avser ett
Stream
objekt.
Få all DVD-försäljning.
Stream
objektet har ett
filter
-metod. Så
försäljning. strömma(). filter ((försäljning) -> försäljning. getItem (). equals ("DVD"))
är ett samtal till metoden
Stream
objektets
filter
Mönstret fortsätter. Metoden
Stream
-objektets
map
returnerar ännu ett annat
Stream
objekt - ett
Stream
objekt som innehåller priser.
Hämtar priset från varje DVD-försäljning.
Stream
av de priser du tillämpar
reducera
-metoden, som ger ett värde på
dubbel
- summan av DVD-priserna.
Få det totala priset på alla DVD-försäljningar.