Sobes.tech
Middle

Zašto se u novoj verziji Jave koriste streamovi?

sobes.tech АИ

Одговор од АИ

Korišćenje streamova u novijim verzijama Jave (od Java 8 nadalje) opravdano je iz više razloga koji se odnose na efikasnost, čitljivost koda i paralelnu obradu podataka:

  • Funkcionalno programiranje: Streamovi omogućavaju pisanje koda u deklarativnijem stilu, fokusirajući se na šta treba uraditi sa podacima, a ne kako. To poboljšava čitljivost i održavanje.
  • Paralelna obrada: Streamovi olakšavaju paralelizaciju operacija nad kolekcijama pomoću parallelStream(). JVM upravlja deljenjem podataka i spajanjem rezultata, pojednostavljujući razvoj višestrukih niti.
  • Efikasnost: Lazy evaluation (leno procenjivanje) u streamovima znači da se operacije izvršavaju samo kada je to potrebno, smanjujući troškove. Međuzavisne operacije (map, filter) ne izvršavaju se odmah, već pri pozivu terminalne operacije (collect, forEach).
  • Poboljšana obrada kolekcija: Obuhvata skup standardnih i visokih operacija za filtriranje, mapiranje i agregaciju podataka u kolekcijama, čime se smanjuje količina ponovljenog koda sa petljama.
  • Nepromenljive operacije: Streamovi ne menjaju originalnu kolekciju iz koje su kreirani, podržavaju principe imutabilnosti i olakšavaju otklanjanje grešaka.
// Primer korišćenja streamova za filtriranje i mapiranje
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");

List<String> filteredNames = names.stream() // Kreiranje streama
                                  .filter(name -> name.startsWith("C")) // Filtriranje
                                  .map(String::toUpperCase) // Mapiranje
                                  .collect(Collectors.toList()); // Sakupljanje u novu listu

System.out.println(filteredNames); // Izlaz: [CHARLIE]

Paralelni streamovi:

// Primer paralelne obrade u streamu
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

int sum = numbers.parallelStream() // Kreiranje paralelnog streama
                   .mapToInt(Integer::intValue) // Konverzija u IntStream
                   .sum(); // Sabiranje

System.out.println(sum); // Izlaz: 55 (može biti brže izračunato na višejezgrenim sistemima)