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)