Sobes.tech
Middle

Prečo sa v novej verzii Javy používajú streamy?

sobes.tech AI

Odpoveď od AI

Použitie streamov v novších verziách Javy (začínajúc od Java 8) je spôsobené radom dôvodov súvisiacich s efektívnosťou, čitateľnosťou kódu a paralelným spracovaním dát:

  • Funkcionálne programovanie: Streamy umožňujú písať kód v deklaratívnejšom štýle, zameriavajúc sa na čo je potrebné spraviť s dátami, nie ako. To zlepšuje čitateľnosť a udržiavateľnosť.
  • Paralelné spracovanie: Streamy umožňujú ľahko paralelizovať operácie spracovania kolekcií pomocou parallelStream(). JVM riadi rozdeľovanie dát a spájanie výsledkov, čo zjednodušuje vývoj viacvláknových aplikácií.
  • Efektívnosť: Lazy evaluation (lenivé vyhodnocovanie) v streamoch znamená, že operácie sa vykonávajú iba v prípade potreby, čo znižuje režijné náklady. Intermediate operácie (map, filter) nevedú k okamžitému vykonaniu pred volaním terminalnej operácie (collect, forEach).
  • Vylepšené spracovanie kolekcií: Poskytujú súbor štandardných, vysokoúrovňových operácií na filtrovanie, mapovanie, agregáciu dát v kolekciách, čo znižuje množstvo šablónového kódu s cyklami.
  • Immutable Operations: Streamy nemenia pôvodnú kolekciu, z ktorej sú vytvorené, čím podporujú princípy nemennosti a zjednodušujú ladenie.
// Príklad použitia streamov na filtrovanie a mapovanie
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");

List<String> filteredNames = names.stream() // Vytvorenie streamu
                                  .filter(name -> name.startsWith("C")) // Filtrovanie
                                  .map(String::toUpperCase) // Mapovanie
                                  .collect(Collectors.toList()); // Zber výsledku do nového zoznamu

System.out.println(filteredNames); // Výstup: [CHARLIE]

Paralelné streamy:

// Príklad paralelného spracovania v streamu
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

int sum = numbers.parallelStream() // Vytvorenie paralelného streamu
                   .mapToInt(Integer::intValue) // Premena na IntStream
                   .sum(); // Súčet

System.out.println(sum); // Výstup: 55 (môže byť vypočítané rýchlejšie na viacjadrových systémoch)