Οι ροές Java 8 επιτρέπουν στους προγραμματιστές να εξαγάγουν ακριβή δεδομένα από μια μεγάλη συλλογή, χρησιμοποιώντας ένα σύνολο προκαθορισμένων λειτουργιών.

Πριν από την κυκλοφορία του Java 8, η χρήση του όρου "stream" στην Java θα συσχετίζεται αυτόματα με I / O. Ωστόσο, η Java 8 εισήγαγε ένα ρεύμα που μπορεί να αναφέρεται ως ένα σύνολο υπολογιστικών βημάτων που συνδέονται μεταξύ τους σε αυτό που συνήθως αναφέρεται ως "αγωγός ροής".

Αυτό το άρθρο θα σας παρουσιάσει τις ροές Java 8 και θα δείξει πώς μπορούν να είναι χρήσιμες στα έργα σας.

Τι είναι μια ροή;

Μια ροή είναι μια διεπαφή Java που παίρνει μια πηγή, πραγματοποιεί ένα σύνολο λειτουργιών για την εξαγωγή συγκεκριμένων δεδομένων και, στη συνέχεια, παρέχει αυτά τα δεδομένα στην εφαρμογή για χρήση. Ουσιαστικά, σας επιτρέπει να εξαγάγετε εξειδικευμένα δεδομένα από μια συλλογή γενικευμένων δεδομένων.

Πώς λειτουργούν οι ροές

Ένας αγωγός ροής ξεκινά πάντα με μια πηγή. Ο τύπος της πηγής εξαρτάται από τον τύπο δεδομένων που αντιμετωπίζετε, αλλά δύο από τα πιο δημοφιλή είναι πίνακες και συλλογές.

instagram viewer

Για να μετατρέψετε τη συλλογή σε μια αρχική ροή, θα πρέπει να προσθέσετε το ρεύμα() λειτουργία στην πηγή. Αυτό θα τοποθετήσει την πηγή στον αγωγό ροής όπου πολλές διαφορετικές ενδιάμεσες λειτουργίες (όπως φίλτρο() και είδος()) μπορεί να λειτουργήσει σε αυτό.

Αφού εκτελεστούν όλες οι απαιτούμενες ενδιάμεσες λειτουργίες, μπορείτε να εισαγάγετε μια τερματική λειτουργία (όπως για κάθε()), το οποίο θα παράγει τα δεδομένα που έχουν εξαχθεί προηγουμένως από την πηγή.

Ζωή χωρίς ροές

Το Java 8 κυκλοφόρησε το 2014, αλλά πριν από αυτό, οι προγραμματιστές της Java χρειάζονταν ακόμη να εξαγάγουν εξειδικευμένα δεδομένα από μια συλλογή γενικών δεδομένων.

Ας υποθέσουμε ότι έχετε μια λίστα τυχαίων χαρακτήρων που συνδυάζονται με τυχαίους αριθμούς για να σχηματίσουν μοναδικές τιμές συμβολοσειράς, αλλά θέλετε μόνο τις τιμές που ξεκινούν με τον χαρακτήρα "C" και θέλετε να τακτοποιήσετε το αποτέλεσμα σε αύξουσα θέση Σειρά. Έτσι θα εξαγάγατε αυτά τα δεδομένα χωρίς ροές.

Σχετιζομαι με: Τι πρέπει να ξέρετε για τη χρήση συμβολοσειρών στην Java

Παράδειγμα φιλτραρίσματος και ταξινόμησης χωρίς ροές


εισαγωγή java.util. ArrayList;
εισαγωγή java.util. Πίνακες;
εισαγωγή java.util. Λίστα;
δημόσια τάξη Main {
δημόσιο στατικό κενό ({String [] args) {
// δηλώστε και αρχικοποιήστε τη λίστα πινάκων
Λίστα randomValues ​​= Arrays.asList (
"E11", "D12", "A13", "F14", "C15", "A16",
"B11", "B12", "C13", "B14", "B15", "B16",
"F12", "E13", "C11", "C14", "A15", "C16",
"F11", "C12", "D13", "E14", "D15", "D16"
);
// δηλώστε ότι η λίστα πίνακα θα αποθηκεύσει τις απαραίτητες τιμές
Λίστα απαιτείταιValues ​​= new ArrayList <> ();
// εξαγωγή των απαιτούμενων τιμών και αποθήκευση τους σε reqquiredValues
randomValues.forEach (τιμή -> {
εάν (value.startsWith ("C")) {
απαιτείταιValues.add (τιμή);
}
});
// ταξινομήστε τις απαιτούμενες τιμές σε αύξουσα σειρά
απαιτείταιValues.sort ((Τιμή συμβολοσειράς1, Τιμή συμβολοσειράς2) -> value1.compareTo (τιμή2));
// εκτυπώστε κάθε τιμή στην κονσόλα
απαιτείταιValues.forEach ((Τιμή συμβολοσειράς) -> System.out.println (τιμή));
}
}

Θα χρειαστεί επίσης να δηλώσετε και να αρχικοποιήσετε τη λίστα πινάκων είτε χρησιμοποιείτε ροές είτε κάποια άλλη μέθοδο εξαγωγής. Αυτό που δεν θα χρειαστεί να κάνετε εάν χρησιμοποιείτε ροές είναι να δηλώσετε μια νέα μεταβλητή για να διατηρήσετε τις απαιτούμενες τιμές ή να δημιουργήσετε τις άλλες πέντε γραμμές κώδικα στο παραπάνω παράδειγμα.

Σχετιζομαι με: Πώς να δημιουργήσετε και να εκτελέσετε λειτουργίες σε συστοιχίες σε Java

Ο παραπάνω κωδικός παράγει την ακόλουθη έξοδο στην κονσόλα:


Γ11
Γ12
Γ13
Γ14
Γ15
Γ16

Ζωή με ροές

Στον προγραμματισμό, η αποδοτικότητα μιλάει για την παραγωγή του ίδιου αποτελέσματος με σημαντικά λιγότερο κώδικα. Αυτό ακριβώς κάνει ο αγωγός ροής για έναν προγραμματιστή. Έτσι την επόμενη φορά που κάποιος ρωτά: "γιατί είναι σημαντικό να χρησιμοποιείς ροές στο έργο σου;" Με απλά λόγια: "οι ροές υποστηρίζουν αποτελεσματικό προγραμματισμό."

Συνεχίζοντας με το παραπάνω παράδειγμα, αυτός είναι ο τρόπος με τον οποίο η εισαγωγή ροών μεταμορφώνει ολόκληρο το πρόγραμμα.

Φιλτράρισμα και ταξινόμηση τιμών με ένα παράδειγμα ροής


εισαγωγή java.util. Πίνακες;
εισαγωγή java.util. Λίστα;
δημόσια τάξη Main {
δημόσιο στατικό κενό ({String [] args) {
// δηλώστε και αρχικοποιήστε τη λίστα πινάκων
Λίστα randomValues ​​= Arrays.asList (
"E11", "D12", "A13", "F14", "C15", "A16",
"B11", "B12", "C13", "B14", "B15", "B16",
"F12", "E13", "C11", "C14", "A15", "C16",
"F11", "C12", "D13", "E14", "D15", "D16"
);
// ανακτά μόνο τιμές που ξεκινούν με C, ταξινομήστε τις και εκτυπώστε τις στην κονσόλα.
randomValues.stream (). filter (value-> value.startsWith ("C")). ταξινομημένο (). forEach (System.out:: println);
}
}

Ο παραπάνω κώδικας δείχνει πόσο ισχυρή είναι η διεπαφή ροής. Παίρνει μια λίστα τυχαίων τιμών πίνακα και τη μετατρέπει σε μια ροή χρησιμοποιώντας το ρεύμα() λειτουργία. Η ροή στη συνέχεια μειώνεται σε μια λίστα πίνακα που περιέχει τις απαιτούμενες τιμές (που είναι όλες οι τιμές που ξεκινούν με ντο), χρησιμοποιώντας το φίλτρο() λειτουργία.

Όπως μπορείτε να δείτε στο παραπάνω παράδειγμα, το ντο Οι τιμές ταξινομούνται τυχαία στη λίστα πίνακα. Εάν επρόκειτο να εκτυπώσετε τη ροή σε αυτό το σημείο στον αγωγό, η τιμή Γ15 θα εκτυπωθεί πρώτα. Επομένως, ο είδος() Η συνάρτηση εισάγεται στον αγωγό ροής για την αναδιάταξη του νέου πίνακα σε αύξουσα σειρά.

Η τελική συνάρτηση στον αγωγό ροής είναι α για κάθε() λειτουργία. Αυτή είναι μια λειτουργία τερματικού που χρησιμοποιείται για να σταματήσει ο αγωγός ροής και παράγει τα ακόλουθα αποτελέσματα στην κονσόλα:


Γ11
Γ12
Γ13
Γ14
Γ15
Γ16

Υπάρχει μια εκτεταμένη λίστα ενδιάμεσων λειτουργιών που μπορούν να χρησιμοποιηθούν σε έναν αγωγό ροής.

Ένας αγωγός ροής ξεκινά πάντα με μία πηγή και ένα ρεύμα() λειτουργία και τελειώνει πάντα με μια λειτουργία τερματικού (αν και υπάρχουν πολλές διαφορετικές Επιλέξτε από.) Αλλά μεταξύ αυτών των δύο ενοτήτων υπάρχει μια λίστα με έξι ενδιάμεσες λειτουργίες που μπορείτε χρήση.

Στο παραπάνω παράδειγμά μας, χρησιμοποιούνται μόνο δύο από αυτές τις ενδιάμεσες λειτουργίεςφίλτρο() και είδος(). Η ενδιάμεση λειτουργία που θα επιλέξετε εξαρτάται από τις εργασίες που θέλετε να εκτελέσετε.

Εάν κάποια από τις τιμές που ξεκινούν με "C" στη λίστα πινάκων μας παραπάνω ήταν με πεζά γράμματα και εκτελέσαμε τις ίδιες ενδιάμεσες λειτουργίες σε αυτές, θα έχουμε το ακόλουθο αποτέλεσμα.

Παράδειγμα εκτέλεσης λειτουργιών φίλτρου και ταξινόμησης σε πεζές τιμές


εισαγωγή java.util. Πίνακες;
εισαγωγή java.util. Λίστα;
δημόσια τάξη Main {
δημόσιο στατικό κενό ({String [] args) {
// δηλώστε και αρχικοποιήστε τη λίστα πινάκων
Λίστα randomValues ​​= Arrays.asList (
"E11", "D12", "A13", "F14", "C15", "A16",
"B11", "B12", "c13", "B14", "B15", "B16",
"F12", "E13", "C11", "C14", "A15", "c16",
"F11", "C12", "D13", "E14", "D15", "D16"
);
// ανακτά μόνο τιμές που ξεκινούν με C, ταξινομήστε τις και εκτυπώστε τις στην κονσόλα.
randomValues.stream (). filter (value-> value.startsWith ("C")). ταξινομημένο (). forEach (System.out:: println);
}
}

Ο παραπάνω κωδικός θα παράγει τις ακόλουθες τιμές στην κονσόλα:


Γ11
Γ12
Γ14
Γ15

Το μόνο πρόβλημα με την παραπάνω έξοδο είναι ότι δεν αντιπροσωπεύει με ακρίβεια όλα τα ντο τιμές στη λίστα πινάκων μας. Ένας καλός τρόπος για να διορθώσετε αυτό το μικρό σφάλμα είναι να εισαγάγετε μια άλλη ενδιάμεση λειτουργία στον αγωγό ροής. αυτή η λειτουργία είναι γνωστή ως χάρτης() λειτουργία.

Χρήση του παραδείγματος λειτουργίας χαρτών


εισαγωγή java.util. Πίνακες;
εισαγωγή java.util. Λίστα;
δημόσια τάξη Main {
δημόσιο στατικό κενό ({String [] args) {
// δηλώστε και αρχικοποιήστε τη λίστα πινάκων
Λίστα randomValues ​​= Arrays.asList (
"E11", "D12", "A13", "F14", "C15", "A16",
"B11", "B12", "c13", "B14", "B15", "B16",
"F12", "E13", "C11", "C14", "A15", "c16",
"F11", "C12", "D13", "E14", "D15", "D16"
);
// μετατρέπει όλους τους πεζούς χαρακτήρες σε κεφαλαία,
// ανακτά μόνο τιμές που ξεκινούν με C, ταξινομήστε τις και εκτυπώστε τις στην κονσόλα.
randomValues.stream (). map (String:: toUpperCase) .filter (value-> value.startsWith ("C")). ταξινομημένο (). forEach (System.out:: println);
}
}

ο χάρτης() Η συνάρτηση μετατρέπει ένα αντικείμενο από τη μία κατάσταση στην άλλη. στο παραπάνω παράδειγμά μας μετατρέπει όλους τους πεζούς χαρακτήρες στη λίστα πίνακα σε κεφαλαίους χαρακτήρες.

Τοποθετώντας το χάρτης() Λειτουργεί λίγο πριν το φίλτρο() Η συνάρτηση ανακτά όλες τις τιμές που ξεκινούν με ντο από τη λίστα πίνακα.

Ο παραπάνω κωδικός παράγει το ακόλουθο αποτέλεσμα στην κονσόλα, αντιπροσωπεύοντας με επιτυχία όλα τα ντο τιμές στη λίστα πίνακα.


Γ11
Γ12
Γ13
Γ14
Γ15
Γ16

Οι άλλες τρεις ενδιάμεσες λειτουργίες που μπορείτε να χρησιμοποιήσετε στις εφαρμογές σας περιλαμβάνουν:

  • κρυφοκοίταγμα()
  • όριο()
  • παραλείπω()

Οι ροές Java 8 διευκολύνουν τη δημιουργία αποτελεσματικού κώδικα

Με τις ροές Java 8 μπορείτε να εξαγάγετε εξαιρετικά συγκεκριμένα, σχετικά δεδομένα από μια μεγάλη πηγή με μία γραμμή κώδικα. Εφόσον συμπεριλαμβάνετε το αρχικό ρεύμα() Λειτουργία και χειριστή τερματικού, μπορείτε να χρησιμοποιήσετε οποιονδήποτε συνδυασμό ενδιάμεσων λειτουργιών που παρέχουν κατάλληλη έξοδο για τον στόχο σας.

Εάν αναρωτιέστε για τη γραμμή κώδικα που περικλείεται στο δικό μας φίλτρο() λειτουργία; είναι γνωστό ως "έκφραση λάμδα". Οι εκφράσεις Lambda είναι ένα άλλο χαρακτηριστικό που παρουσιάζεται στο Java 8 και έχει πολλά ψήγματα που μπορεί να σας φανούν χρήσιμα.

ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ
Μια γρήγορη εισαγωγή στο Java 8 Lambdas

Εάν είστε προγραμματιστής Java και σας ενδιαφέρει να μάθετε περισσότερα για το Java 8 lambda, σε αυτό το άρθρο θα ρίξουμε μια πιο προσεκτική ματιά στη σύνταξη και τη χρήση lambda.

Διαβάστε Επόμενο

Σχετικά θέματα
  • Προγραμματισμός
  • Ιάβα
  • Εκμάθηση κωδικοποίησης
Σχετικά με τον Συγγραφέα
Kadeisha Kean (Δημοσιεύθηκαν 13 άρθρα)

Ο Kadeisha Kean είναι προγραμματιστής λογισμικού πλήρους στοίβας και συγγραφέας τεχνικής / τεχνολογίας. Έχει την ξεχωριστή ικανότητα να απλοποιεί μερικές από τις πιο περίπλοκες τεχνολογικές έννοιες. παράγοντας υλικό που μπορεί εύκολα να γίνει κατανοητό από κάθε αρχάριο της τεχνολογίας. Είναι παθιασμένη να γράφει, να αναπτύσσει ενδιαφέρον λογισμικό και να ταξιδεύει στον κόσμο (μέσω ντοκιμαντέρ).

Περισσότερα από την Kadeisha Kean

Εγγραφείτε στο Newsletter μας

Εγγραφείτε στο ενημερωτικό δελτίο μας για τεχνικές συμβουλές, κριτικές, δωρεάν ebook και αποκλειστικές προσφορές!

Ένα ακόμη βήμα…!

Επιβεβαιώστε τη διεύθυνση email σας στο email που μόλις σας στείλαμε.

.