Sobes.tech
Middle

Γιατί χρησιμοποιούνται streams στη νέα έκδοση της Java;

sobes.tech AI

Απάντηση από AI

Η χρήση των streams στις νεότερες εκδόσεις της Java (από Java 8 και μετά) οφείλεται σε διάφορους λόγους που σχετίζονται με την αποδοτικότητα, την αναγνωσιμότητα του κώδικα και την παράλληλη επεξεργασία δεδομένων:

  • Λειτουργικός προγραμματισμός: Τα streams επιτρέπουν τη γραφή κώδικα με πιο δηλωτικό στυλ, εστιάζοντας στο τι πρέπει να γίνει με τα δεδομένα, και όχι στο πώς. Αυτό βελτιώνει την αναγνωσιμότητα και τη συντηρησιμότητα.
  • Παράλληλη επεξεργασία: Τα streams διευκολύνουν τον παράλληλο χειρισμό λειτουργιών σε συλλογές μέσω του parallelStream(). Η JVM διαχειρίζεται τον διαχωρισμό των δεδομένων και τη συγχώνευση των αποτελεσμάτων, απλοποιώντας την ανάπτυξη πολυνηματικών εφαρμογών.
  • Αποδοτικότητα: Η αργή αξιολόγηση (lazy evaluation) στα streams σημαίνει ότι οι λειτουργίες εκτελούνται μόνο όταν χρειάζεται, μειώνοντας το κόστος. Οι ενδιάμεσες λειτουργίες (map, filter) δεν εκτελούνται άμεσα, μέχρι να καλεστεί μια τελική λειτουργία (collect, forEach).
  • Βελτιωμένη επεξεργασία συλλογών: Παρέχουν ένα σύνολο τυπικών και υψηλού επιπέδου λειτουργιών για φιλτράρισμα, χάρτη και συσσώρευση δεδομένων σε συλλογές, μειώνοντας τον επαναλαμβανόμενο κώδικα με βρόχους.
  • Μη μεταβαλλόμενες λειτουργίες: Τα streams δεν τροποποιούν τη αρχική συλλογή από την οποία δημιουργούνται, υποστηρίζοντας τις αρχές της αμεταβλητότητας και διευκολύνοντας το debugging.
// Παράδειγμα χρήσης των streams για φιλτράρισμα και χάρτη
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");

List<String> filteredNames = names.stream() // Δημιουργία stream
                                  .filter(name -> name.startsWith("C")) // Φιλτράρισμα
                                  .map(String::toUpperCase) // Χαρτογράφηση
                                  .collect(Collectors.toList()); // Συλλογή σε νέα λίστα

System.out.println(filteredNames); // Έξοδος: [CHARLIE]

Παράλληρα streams:

// Παράδειγμα παράλληλης επεξεργασίας σε stream
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

int sum = numbers.parallelStream() // Δημιουργία παράλληλου stream
                   .mapToInt(Integer::intValue) // Μετατροπή σε IntStream
                   .sum(); // Άθροιση

System.out.println(sum); // Έξοδος: 55 (μπορεί να υπολογιστεί πιο γρήγορα σε συστήματα πολλαπλών πυρήνων)