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)