Βίντεο: Fun with Music and Programming by Connor Harris and Stephen Krewson 2024
Η Java έχει φανταχτερά μεθόδους που κάνουν τη βέλτιστη χρήση των ρευμάτων και των εκφράσεων λάμδα. Με ρεύματα και εκφράσεις λάμβδα, μπορείτε να δημιουργήσετε μια γραμμή συναρμολόγησης. Η λύση γραμμής συναρμολόγησης χρησιμοποιεί έννοιες από λειτουργικό προγραμματισμό.
Η γραμμή συναρμολόγησης αποτελείται από διάφορες μεθόδους. Κάθε μέθοδος λαμβάνει τα δεδομένα, μετασχηματίζει τα δεδομένα με κάποιο τρόπο ή άλλα και μεταδίδει τα αποτελέσματά της στην επόμενη στη σειρά μέθοδο. Εδώ είναι μια γραμμή συναρμολόγησης.
Κάθε κουτί αντιπροσωπεύει μια δέσμη πρώτων υλών καθώς μεταμορφώνονται κατά μήκος μιας γραμμής συναρμολόγησης. Κάθε βέλος αντιπροσωπεύει μια μέθοδο (ή, μεταφορικά, έναν εργαζόμενο στη γραμμή συναρμολόγησης).
Για παράδειγμα, κατά τη μετάβαση από το δεύτερο πλαίσιο στο τρίτο πλαίσιο, μια μέθοδος εργαζόμενου (η μέθοδος
φίλτρο
) εξαλείφει τις πωλήσεις αντικειμένων που δεν είναι DVD. Φανταστείτε ότι η Lucy Ricardo στέκεται μεταξύ του δεύτερου και του τρίτου κουτιού, αφαιρώντας κάθε βιβλίο ή CD από τη γραμμή συναρμολόγησης και πετάμε το απρόσεκτα στο πάτωμα.
της Java είναι
Predicate
- μια έκφραση λάμδα με αποτέλεσμα
boolean
. Η μέθοδος
φίλτρου
αυξάνει τα στοιχεία που δεν περνούν τη δοκιμή
true / false
της έκφρασης lambda.
Ορισμένες μέθοδοι λειτουργικού προγραμματισμού
Μέλος | Παράμετρος | Τύπος αποτελέσματος | Ροή που εκτοξεύει στοιχεία του φίλτρου συλλογής | |
|
Ρεύμα
Πρόβλεψη
Ροή
|
> Μια νέα ροή που περιέχει τιμές για τις οποίες η έκφραση lambda επιστρέφει |
true
|
map |
Ρεύμα
|
Λειτουργία
|
Ρεύμα
|
Μια νέα ροή που περιέχει τα αποτελέσματα εφαρμογής της έκφρασης lambda στην εισερχόμενη ροή
|
μείωση
ροή
|
BinaryOperator
|
Ο τύπος που χρησιμοποιείται από το
|
BinaryOperator
|
Το αποτέλεσμα του συνδυασμού όλων των τιμών στην εισερχόμενη ροή
|
|
χάρτη
|
) τραβά την τιμή
|
|
από κάθε
πώληση
|
. Από εκείνο τον εργαζόμενο, η γραμμή συναρμολόγησης περιέχει τιμές |
.
Για να είμαστε ακριβέστεροι, η μέθοδος
της
της Java παίρνει
Λειτουργία
όπως
(πώληση) -> πώληση. getPrice ()
και εφαρμόζει τη συνάρτηση
σε κάθε τιμή μιας ροής. Έτσι, η μέθοδος
χάρτη
λαμβάνει μια εισερχόμενη ροή αντικειμένων
πώλησης
και δημιουργεί μια εξερχόμενη ροή τιμών
.
Κατά τη μετάβαση από το τέταρτο πλαίσιο στο πέμπτο πλαίσιο, η μέθοδος των εργαζομένων (η μέθοδος
μείωση
) προσθέτει τις τιμές των πωλήσεων DVD.Η μέθοδος
μειώνει τη
της Java παίρνει δύο παραμέτρους:
Η πρώτη παράμετρος είναι μια αρχική τιμή.
Στην παραπάνω εικόνα, η αρχική τιμή είναι
0. 0
.
Η δεύτερη παράμετρος είναι
BinaryOperator
.
Στην παραπάνω εικόνα, η μέθοδος
μειώνει
τη μέθοδο BinaryOperator
είναι
(τιμή1, τιμή2) -> τιμή1 + τιμή2
χρησιμοποιεί το
BinaryOperator
για να συνδυάσει τις τιμές από την εισερχόμενη ροή. Η αρχική τιμή χρησιμεύει ως σημείο εκκίνησης για το σύνολο των συνδυασμών. Έτσι, η μέθοδος
reduce
κάνει δύο προσθήκες.
Η μέθοδος μείωσης προσθέτει δύο τιμές από μια εισερχόμενη ροή.
Για σύγκριση, φανταστείτε να καλέσετε τη μέθοδο
να μειώσετε (10. 0, (value1, value2) -> value1 * value2)
με τη ροή των οποίων οι τιμές περιλαμβάνουν
3. 0
,
2. 0
και
5. 0
. Η προκύπτουσα ενέργεια εμφανίζεται παρακάτω
Η μέθοδος μείωσης πολλαπλασιάζει τις τιμές από μια εισερχόμενη ροή.
Μπορεί να έχετε ακούσει το μοντέλο προγραμματισμού MapReduce της Google. Η ομοιότητα μεταξύ του ονόματος του μοντέλου προγραμματισμού και της μεθόδου Java map
και
μείωση
δεν είναι σύμπτωση.
Λαμβάνονται ως σύνολο, ολόκληρη η σειρά συναρμολόγησης μέχρι τις τιμές των DVD που πωλήθηκαν. Ο παραπάνω κώδικας περιέχει ένα πλήρες πρόγραμμα χρησιμοποιώντας τις ροές και τις εκφράσεις lambda την πρώτη εικόνα παραπάνω.
εισαγωγή java. κείμενο. ΑριθμόςFormat;
εισαγωγή java. χρήσιμο. ArrayList;
Δημόσια τάξη TallySales {
δημόσιο static void κύρια {String [] args) {
πωλήσεις = new ArrayList <> ();
Νόμισμα NumberFormat = Αριθμός Φορμά. getCurrencyInstance ();
fillTheList (πωλήσεις);
διπλό σύνολο = πωλήσεις. stream ()
. φίλτρο ((πώληση) -> πώληση) getItem () ισούται με ("DVD"))
. map ((πώληση) -> πώληση. getPrice ())
. μείωση (0, 0, (τιμή1, τιμή2) -> τιμή1 + τιμή2)?
Σύστημα. έξω. εκτύπωση (μορφή νομίσματος (σύνολο));
}
πωλήσεις static void fillTheList (ArrayList
πωλήσεις)
πωλήσεις. προσθέστε (νέα πώληση ("Βιβλίο", 12. 00))?
πωλήσεις. προσθέστε (νέα πώληση ("DVD", 21. 00))?
πωλήσεις. προσθέστε (νέα πώληση ("CD", 5. 25))?
}
}
Ο κώδικας απαιτεί Java 8 ή νεότερη έκδοση. Εάν το IDE έχει οριστεί για μια παλαιότερη έκδοση Java, μπορεί να χρειαστεί να πατήσετε με τις ρυθμίσεις του IDE. Ίσως χρειαστεί να κάνετε λήψη και νεότερης έκδοσης Java.
Η τολμηρή όψη είναι μια μεγάλη εντολή εκχώρησης Java. Η δεξιά πλευρά της εντολής περιέχει μια ακολουθία κλήσεων μεθόδου. Κάθε κλήση μεθόδου επιστρέφει ένα αντικείμενο και κάθε τέτοιο αντικείμενο είναι το πράγμα πριν από την τελεία στην επόμενη κλήση μεθόδου. Έτσι διαμορφώνετε τη γραμμή συναρμολόγησης.
Για παράδειγμα, κοντά στην αρχή του κωδικού με έντονη γραφή, το όνομα
πωλήσεις
ArrayList
. Κάθε αντικείμενο
ArrayList
έχει μια μέθοδο
ροή
. Στον παραπάνω κώδικα, πωλήσεις
. stream ()
είναι μια κλήση προς τη μέθοδο
του αρχείου
της ροής
του αντικειμένου
ArrayList
.
Η μέθοδος ροής επιστρέφει μια εμφάνιση της κλάσης
Stream
της Java. (Τι έκπληξη!) Έτσι πωλήσεις
. stream ()
αναφέρεται σε αντικείμενο
Stream
.
Λήψη όλων των πωλήσεων DVD.
Κάθε αντικείμενο
Stream
έχει μια μέθοδο
φίλτρο
. Έτσι
πωλήσεις. ρεύμα(). filter9 ((πώληση) -> πώληση) getItem () ισούται ("DVD"))
είναι η κλήση της μεθόδου
φίλτρου
.
Το μοτίβο συνεχίζεται. Η μέθοδος
Stream
του αντικειμένου
χάρτη
επιστρέφει ακόμα ένα αντικείμενο
Stream
- αντικείμενο
Stream
που περιέχει τιμές.
Λήψη της τιμής από κάθε πώληση DVD.
Στο
Ρεύμα
των τιμών εφαρμόζετε τη μέθοδο
μείωση
, η οποία αποδίδει μια τιμή
διπλή
- το σύνολο των τιμών DVD.
Λήψη της συνολικής τιμής όλων των πωλήσεων DVD.