Sobes.tech
Middle

De ce sunt folosiți stream-urile în noua versiune de Java?

sobes.tech AI

Răspuns de la AI

Utilizarea streamurilor în versiunile mai noi ale Java (începând cu Java 8) se datorează mai multor motive legate de eficiență, lizibilitatea codului și procesarea paralelă a datelor:

  • Programare funcțională: Streamurile permit scrierea codului într-un stil mai declarativ, concentrându-se pe ce trebuie făcut cu datele, nu pe cum. Acest lucru îmbunătățește lizibilitatea și întreținerea.
  • Procesare paralelă: Streamurile facilitează paralelizarea operațiilor pe colecții folosind parallelStream(). JVM gestionează împărțirea datelor și unirea rezultatelor, simplificând dezvoltarea aplicațiilor multi-thread.
  • Eficiență: Evaluarea leneșă (lazy evaluation) în streamuri înseamnă că operațiile sunt executate doar când este nevoie, reducând costurile. Operațiile intermediare (map, filter) nu se execută imediat până la apelarea unei operații terminale (collect, forEach).
  • Îmbunătățirea procesării colecțiilor: Oferă un set de operații standard și de nivel înalt pentru filtrare, mapare și agregare de date în colecții, reducând cantitatea de cod repetitiv cu bucle.
  • Operații imutabile: Streamurile nu modifică colecția originală din care sunt create, susținând principiile imutabilității și facilitând depanarea.
// Exemplu de utilizare a streamurilor pentru filtrare și mapare
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");

List<String> filteredNames = names.stream() // Crearea unui stream
                                  .filter(name -> name.startsWith("C")) // Filtrare
                                  .map(String::toUpperCase) // Mapare
                                  .collect(Collectors.toList()); // Colectare într-o listă nouă

System.out.println(filteredNames); // Afișează: [CHARLIE]

Streamuri paralele:

// Exemplu de procesare paralelă într-un stream
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

int sum = numbers.parallelStream() // Crearea unui stream paralel
                   .mapToInt(Integer::intValue) // Conversie în IntStream
                   .sum(); // Suma

System.out.println(sum); // Afișează: 55 (poate fi calculat mai rapid pe sisteme multi-core)