Sobes.tech
Middle

Proč se v nové verzi Javy používají streamy?

sobes.tech AI

Odpověď od AI

Použití streamů v novějších verzích Javy (od Java 8) je odůvodněno několika důvody souvisejícími s efektivitou, čitelností kódu a paralelním zpracováním dat:

  • Funkcionální programování: Streamy umožňují psát kód v deklarativnějším stylu, zaměřeném na co je potřeba s daty udělat, nikoliv jak. To zlepšuje čitelnost a udržovatelnost.
  • Paralelní zpracování: Streamy usnadňují paralelizaci operací na kolekcích pomocí parallelStream(). JVM řídí rozdělení dat a spojení výsledků, což zjednodušuje vývoj vícero vláknových aplikací.
  • Efektivita: Lazy evaluation (líné vyhodnocování) ve streamech znamená, že operace jsou vykonávány pouze tehdy, když je to nutné, což snižuje režii. Meziprodukty (map, filter) se nevykonávají okamžitě, dokud není volána terminální operace (collect, forEach).
  • Vylepšené zpracování kolekcí: Poskytují sadu standardních a vysoké úrovně operací pro filtrování, mapování a agregaci dat v kolekcích, což snižuje množství opakovaného kódu s cykly.
  • Neměnné operace: Streamy nemění původní kolekci, ze které jsou vytvořeny, podporují principy neměnnosti a usnadňují ladění.
// Příklad použití streamů pro filtrování a mapování
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");

List<String> filteredNames = names.stream() // Vytvoření streamu
                                  .filter(name -> name.startsWith("C")) // Filtrování
                                  .map(String::toUpperCase) // Mapování
                                  .collect(Collectors.toList()); // Sbírání do nové listy

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

Paralelní streamy:

// Příklad paralelního zpracování ve streamu
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

int sum = numbers.parallelStream() // Vytvoření paralelního streamu
                   .mapToInt(Integer::intValue) // Převod na IntStream
                   .sum(); // Součet

System.out.println(sum); // Výstup: 55 (může být spočítáno rychleji na vícejádrových systémech)