Πώς να χρησιμοποιήσετε τη συνάρτηση Java collect() για τη συλλογή και επεξεργασία δεδομένων
Οι συλλέκτες ροών (Stream Collectors) είναι μια ισχυρή λειτουργία του Java 8 Stream API που σας επιτρέπει να συλλέγετε και να επεξεργάζεστε δεδομένα αποτελεσματικά. Εδώ θα εξηγήσουμε τη δομή τους και πώς μπορεί να χρησιμοποιηθεί η μέθοδος Java collect().
Πώς μπορεί να χρησιμοποιηθεί η εντολή Java collect();
Ένας συλλέκτης ροής μπορεί να χρησιμοποιηθεί για τη δημιουργία μιας λίστας, ενός συνόλου ή ενός χάρτη από μια ροή. Μια ροή είναι μια ακολουθία στοιχείων που υποβάλλονται σε επεξεργασία το ένα μετά το άλλο. Η διεπαφή συλλέκτη παρέχει ένα σύνολο λειτουργιών μείωσης για τα δεδομένα σε έναν αγωγό ροής. Πρόκειται για τερματικές λειτουργίες που συλλέγουν και συγχωνεύουν τα αποτελέσματα των ενδιάμεσων βημάτων.
Οι συλλέκτες μπορούν να χρησιμοποιηθούν για το φιλτράρισμα ή την ταξινόμηση αντικειμένων από ένα ρεύμα. Είναι επίσης δυνατή η συγκέντρωση, όπως η άθροιση αριθμών, ο συνδυασμός συμβολοσειρών ή η μέτρηση στοιχείων. Επιπλέον, οι συλλέκτες διαθέτουν λειτουργίες που μπορούν να μετατρέψουν το περιεχόμενο ενός ρεύματος σε μια συγκεκριμένη δομή. Μπορείτε, για παράδειγμα, να μετατρέψετε μια λίστα σε χάρτη. Οι ομαδοποιήσεις βοηθούν στην κατηγοριοποίηση στοιχείων με συγκεκριμένες ιδιότητες ή συνθήκες. Το πιο σημαντικό είναι ότι οι συλλέκτες ροής έχουν το πλεονέκτημα ότι μπορούν να επεξεργάζονται δεδομένα ταυτόχρονα χρησιμοποιώντας πολλαπλά νήματα. Αυτό επιτρέπει την εκτέλεση λειτουργιών πολύ πιο γρήγορα και αποτελεσματικά, ειδικά με μεγάλες ποσότητες δεδομένων.
Ποια είναι η σύνταξη για το Java collect()?
Η μέθοδος δέχεται ως όρισμα ένα Collector που περιγράφει τον τρόπο με τον οποίο τα στοιχεία του ρεύματος πρέπει να συλλέγονται και να συγκεντρώνονται. Το Collector είναι μια διεπαφή που παρέχει διάφορες μεθόδους για τη συγκέντρωση στοιχείων ρεύματος σε μια συγκεκριμένη μορφή, για παράδειγμα, σε μια λίστα, ένα σύνολο ή έναν χάρτη.
Υπάρχουν δύο παραλλαγές της μεθόδου collect() της Java Stream:
- R collect(Προμηθευτής<R> προμηθευτής, BiConsumer<R, ? super T> συσσωρευτής,BiConsumer<R, R> συνδυαστής)
- <R, A> R collect(Collector<? super T, A, R> collector)
Η πρώτη παραλλαγή έχει τρεις συναρτήσεις ως ορίσματα:
- προμηθευτής: δημιουργεί ένα δοχείο που θα χρησιμοποιηθεί για ενδιάμεσα αποτελέσματα
- accumulator: υπολογίζει το τελικό αποτέλεσμα
- συνδυαστής: συνδυάζει τα αποτελέσματα των παράλληλων λειτουργιών ροής
Αυτοί οι προκαθορισμένοι συλλέκτες περιλαμβάνονται ήδη στη βασική βιβλιοθήκη και μπορούν εύκολα να εισαχθούν και να χρησιμοποιηθούν.
Η δεύτερη παραλλαγή δέχεται ένα Collector ως όρισμα και επιστρέφει ένα αποτέλεσμα.
- R: ο τύπος του αποτελέσματος
- T: ο τύπος των στοιχείων στο ρεύμα
- A: ο τύπος του συσσωρευτή που αποθηκεύει την ενδιάμεση κατάσταση της λειτουργίας του συλλέκτη
- συλλέκτης: εκτελεί τη λειτουργία μείωσης.
Χρησιμοποιώντας αυτή την παραλλαγή, οι προγραμματιστές μπορούν να δημιουργήσουν προσαρμοσμένους συλλέκτες που είναι ειδικά προσαρμοσμένοι στις απαιτήσεις τους και παρέχουν μεγαλύτερη ευελιξία και έλεγχο στη διαδικασία μείωσης.
Ποια είναι τα πρακτικά παραδείγματα χρήσης της Java collect()?
Παρακάτω παρουσιάζουμε διάφορες λειτουργίες της μεθόδου Stream.collect(). Πριν προχωρήσετε στο πλαίσιο συλλογής, θα πρέπει να είστε ήδη εξοικειωμένοι με τους βασικούς τελεστές Java.
Συνδέστε μια λίστα συμβολοσειρών
Με το Java Collect(), μπορούμε να συνενώσουμε μια λίστα συμβολοσειρών για να δημιουργήσουμε μια νέα συμβολοσειρά:
List<String> letters = List.of("a", "b", "c", "d", "e");
// without combiner function
StringBuilder result = letters.stream().collect(StringBuilder::new, (x, y) -> x.append(y),
(a, b) -> a.append(",").append(b));
System.out.println(result.toString());
// with combiner function
StringBuilder result1 = letters.parallelStream().collect(StringBuilder::new, (x, y) -> x.append(y),
(a, b) -> a.append(",").append(b));
System.out.println(result1.toString());JavaΤο αποτέλεσμα είναι:
abcde
a, b, c, d, eJavaΣτον πρώτο υπολογισμό, χρησιμοποιήθηκε μόνο μία παρουσία StringBuilder και δεν υπήρχε συνάρτηση συνδυασμού. Αυτός είναι ο λόγος για τον οποίο το αποτέλεσμα είναι abcde.
Στη δεύτερη έξοδο, η συνάρτηση συνδυασμού συνένωσε τις παρουσίες StringBuilder και τις χώρισε με κόμμα.
Συλλέξτε στοιχεία σε μια λίστα με το toList()
Μπορούμε να χρησιμοποιήσουμε τη συνάρτηση filter() για να επιλέξουμε ορισμένα στοιχεία μιας λίστας και στη συνέχεια να χρησιμοποιήσουμε toList() για να τα αποθηκεύσουμε σε μια νέα λίστα.
List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6, 7);
List<Integer> oddNumbers = numbers.stream().filter(x -> x % 2 != 0).collect(Collectors.toList());
System.out.println(oddNumbers);JavaΣτη νέα λίστα υπάρχουν μόνο μονό αριθμοί:
[1, 3, 5, 7]JavaΣυλλέξτε στοιχεία σε ένα σύνολο με το toSet()
Ομοίως, μπορούμε να επιλέξουμε στοιχεία και να δημιουργήσουμε ένα νέο σύνολο από αυτά. Τα στοιχεία ενός συνόλου δεν χρειάζεται να είναι διατεταγμένα σε συγκεκριμένη σειρά.
List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6, 7);
Set<Integer> evenNumbers = numbers.parallelStream().filter(x -> x % 2 == 0).collect(Collectors.toSet());
System.out.println(evenNumbers);JavaΑυτό εμφανίζει το αποτέλεσμα:
[2, 4, 6]JavaΣυλλέξτε στοιχεία σε έναν χάρτη με το toMap()
Ένας χάρτης μπορεί να χρησιμοποιηθεί μαζί με τη μέθοδο Java collect() για να αντιστοιχίσει μια τιμή σε κάθε κλειδί.
List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6, 7);
Map<Integer, String> mapEvenNumbers = numbers.parallelStream().filter(x -> x % 2 == 0)
.collect(Collectors.toMap(Function.identity(), x -> String.valueOf(x)));
System.out.println(mapEvenNumbers);JavaΣτην έξοδο, μπορούμε να δούμε ότι σε κάθε ζυγό αριθμό στην είσοδο έχει αποδοθεί μια τιμή που είναι ίδια με αυτόν:
{2=2, 4=4, 6=6}JavaΣυνδυάστε στοιχεία σε μια συμβολοσειρά με τη συνάρτηση joining()
Η μέθοδος joining() συνδυάζει στοιχεία σε ένα ρεύμα με τη σειρά με την οποία εμφανίζονται και χρησιμοποιεί ένα διαχωριστικό για να διαχωρίσει τα στοιχεία. Το διαχωριστικό μεταβιβάζεται ως όρισμα στο joining(). Εάν δεν έχει καθοριστεί διαχωριστικό, joining() χρησιμοποιεί την κενή συμβολοσειρά "".
jshell> String result1 = Stream.of("a", "b", "c").collect(Collectors.joining());
jshell> String result2 = Stream.of("a", "b", "c").collect(Collectors.joining(",", "{", "}"));JavaΤα αποτελέσματα είναι:
result1 ==> "abc"
result2 ==> "{a,b,c}"Java2031f050ecb6acd05c8d5a15242b684b