Sobes.tech
Middle

Zašto se koriste streamovi u novoj verziji Jave?

sobes.tech АИ

Одговор од АИ

Поточи у Јави 8+ се користе за декларативну обраду секвенција података. Омогућавају извођење функционалних операција над колекцијама (листама, скуповима), низовима или другим изворима података у стилу цевовода.

Главне предности коришћења потока:

  • Декларативни стил: Омогућавају опис "шта" треба урадити са подацима, а не "како". Ово чини код читљивијим и разумљивијим.
  • Леније израчунавање: Операције се обрађују само када је потребно, што може побољшати перформансе, посебно при раду са великим количинама података.
  • Паралелна обрада: Поточи се лако могу паралелизовати (коришћењем parallelStream()), што омогућава ефикасно коришћење мулти-језгарних процесора.
  • Смањење количине шаблонског кода: Замењују традиционалне петље и итераторе са изразитијим и компактнијим конструкцијама.
  • Непроменљивост: Поточи не мењају извор података.

Примери уобичајених операција са потоцима:

  • Филтрирање: filter() - избор елемената по услову.
  • Трансформација (маппинг): map() - трансформација сваког елемента.
  • Сортирање: sorted() - сортирање елемената.
  • Јединствени елементи: distinct() - уклањање дупликата.
  • Груписање: collect(Collectors.groupingBy(...)) - груписање елемената по карактеристици.
  • Статистика/Агрегација: count(), sum(), average(), max(), min(), reduce() - извођење агрегатних операција.
  • Скупљање у колекцију: collect(Collectors.toList()), collect(Collectors.toSet()) - сакупљање резултата у колекцију.

Пример употребе:

// Филтрирање и трансформација листе стрингова коришћењем потока
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");

List<String> filteredNames = names.stream() // Креирање потока из листе
                                   .filter(name -> name.startsWith("A")) // Филтрирање: задржава само имена која почињу са "A"
                                   .map(String::toUpperCase) // Трансформација: сваки назив у велика слова
                                   .collect(Collectors.toList()); // Сакупљање резултата у нову листу

System.out.println(filteredNames); // Излаз: [ALICE]