Ροές Java για αρχάριους: Εισαγωγή στη χρήση ροών στην Java

Ροές Java για αρχάριους: Εισαγωγή στη χρήση ροών στην Java

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





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





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





Τι είναι το Stream;

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

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

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



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

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





Ζωή χωρίς ρεύματα

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

εικονίδιο ήχου των Windows 10 λείπει από τη γραμμή εργασιών

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





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

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


import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
//declare and initialize the array list
List 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'
);
//declare the array list will store needed values
List requiredValues = new ArrayList();
//extracting the required values and storing them in reqquiredValues
randomValues.forEach(value -> {
if(value.startsWith('C')) {
requiredValues.add(value);
}
});
//sort the requiredValues in ascending order
requiredValues.sort((String value1, String value2) -> value1.compareTo(value2));
//print each value to the console
requiredValues.forEach((String value) -> System.out.println(value));
}
}

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

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

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


C11
C12
C13
C14
C15
C16

Ζωή με ρέματα

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

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

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


import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
//declare and initialize the array list
List 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'
);
//retrieves only values that start with C, sort them, and print them to the console.
randomValues.stream().filter(value->value.startsWith('C')).sorted().forEach(System.out::println);
}
}

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

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

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


C11
C12
C13
C14
C15
C16

Ροή ενδιάμεσων λειτουργιών

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

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

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

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

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


import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
//declare and initialize the array list
List 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'
);
//retrieves only values that start with C, sort them, and print them to the console.
randomValues.stream().filter(value->value.startsWith('C')).sorted().forEach(System.out::println);
}
}

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


C11
C12
C14
C15

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

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


import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
//declare and initialize the array list
List 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'
);
//transforms all lower case characters to upper case,
//retrieves only values that start with C, sort them, and print them to the console.
randomValues.stream().map(String::toUpperCase).filter(value->value.startsWith('C')).sorted().forEach(System.out::println);
}
}

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

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

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


C11
C12
C13
C14
C15
C16

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

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

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

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

πώς να ελέγξετε τη θερμοκρασία του gpu

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

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

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

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

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

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

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

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

Κάντε κλικ εδώ για εγγραφή