Sobes.tech
Middle

Kodėl naujoje Java versijoje naudojami srautai?

sobes.tech AI

Atsakymas iš AI

Naudojant srautus naujesnėse Java versijose (nuo Java 8) yra keletas priežasčių, susijusių su efektyvumu, kodo skaitomumu ir duomenų paraleliniu apdorojimu:

  • Funkcinis programavimas: Srautai leidžia rašyti deklaratyvesnį kodą, sutelkiant dėmesį į reikia padaryti su duomenimis, o ne kaip. Tai gerina skaitomumą ir palaikomumą.
  • Paralelinis apdorojimas: Srautai leidžia lengvai paralelizuoti kolekcijų apdorojimo operacijas naudojant parallelStream(). JVM valdo duomenų skaidymą ir rezultatų sujungimą, tai supaprastina daugiagijų programų kūrimą.
  • Efektyvumas: Lazy evaluation (vėlyvas įvertinimas) srautų operacijose reiškia, kad operacijos vykdomos tik tada, kai jų reikia, tai sumažina papildomas išlaidas. Tarpiniai veiksmai (map, filter) nevykdomi iš karto iki terminalo operacijos (collect, forEach) iškvietimo.
  • Patobulintas kolekcijų apdorojimas: Jie siūlo standartinių, aukšto lygio operacijų rinkinį filtravimui, žemėlapių sudarymui, duomenų agregavimui kolekcijose, kas sumažina ciklų šabloninio kodo kiekį.
  • Immutable Operations: Srautai nekeičia pradinės kolekcijos, iš kurios jie sukurti, palaiko imutabilumo principus ir palengvina derinimą.
// Pavyzdys, kaip naudoti srautus filtravimui ir žemėlapių sudarymui
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");

List<String> filteredNames = names.stream() // Srauto sukūrimas
                                  .filter(name -> name.startsWith("C")) // Filtravimas
                                  .map(String::toUpperCase) // Žemėlapių sudarymas
                                  .collect(Collectors.toList()); // Rezultato surinkimas į naują sąrašą

System.out.println(filteredNames); // Išvestis: [CHARLIE]

Paralelūs srautai:

// Pavyzdys, kaip naudoti paralelų srautą
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

int sum = numbers.parallelStream() // Paruošimas paraleliniam srautui
                   .mapToInt(Integer::intValue) // Konvertavimas į IntStream
                   .sum(); // Suma

System.out.println(sum); // Išvestis: 55 (gali būti apskaičiuota greičiau daugialypėse sistemose)