Перейти до основного вмісту
Модуль 7 · Урок 2 із 214/14 у курсі~15 min
Модульні уроки (2/2)

API потоку

Stream API у Java дозволяє обробляти колекції об’єктів декларативним способом, використовуючи функціональне програмування. Потік не зберігає дані, а переносить елементи з джерела (наприклад, списку або масиву) через конвеєр операцій.

Трубопровід Stream складається з трьох частин:

  1. Джерело (наприклад, list.stream())
  2. Нуль або більше проміжних операцій (які повертають новий потік, наприклад, filter, map)
  3. Термінальна операція (яка створює кінцевий результат або побічний ефект і закриває потік, наприклад, collect, forEach, reduce)

Загальні проміжні операції

Проміжні операції є ледачими: вони не виконуються, доки не буде викликана операція терміналу.

  • filter(Predicate): фільтрує елементи на основі логічної умови.
  • map(Function): перетворює кожен елемент на інший об’єкт шляхом застосування функції.
  • sorted(): сортує елементи потоку.
Java
List<String> names = Arrays.asList("Marco", "Anna", "Giovanni");
List<String> filtered = names.stream()
                             .filter(name -> name.startsWith("M"))
                             .map(name -> name.toUpperCase())
                             .collect(Collectors.toList()); // "MARCO"

Загальні термінальні операції

  • forEach(Consumer): виконує дію для кожного елемента потоку.
  • collect(Collector): збирає результати потоку в контейнер (наприклад, список із використанням Collectors.toList()).
  • reduce(identity, BinaryOperator): об’єднує елементи потоку в одне сукупне значення.
Java
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
int sum = numbers.stream()
                 .reduce(0, (a, b) -> a + b); // Sums all numbers: 10

Спробуйте самі

вправи#java.m7.l2.e1
Спроби: 0Завантаження…

Завершіть код, використовуючи потік чисел, щоб відфільтрувати лише парні числа, зібрати їх у новий список під назвою even і надрукувати його за допомогою System.out.println.

Завантаження редактора…
Показати підказку

Почніть із виклику `numbers.stream()`, додайте `.filter(n -> n % 2 == 0)` і, нарешті, збирайте за допомогою `.collect(Collectors.toList())`.

Рішення доступне після 3 спроб

вправи#java.m7.l2.e2
Спроби: 0Завантаження…

Використовуйте потоки, щоб перетворити всі імена в списку імен у верхній регістр за допомогою map, і надрукуйте їх один за одним за допомогою forEach із посиланням на метод.

Завантаження редактора…
Показати підказку

Використовуйте `.map(s -> s.toUpperCase())`, а потім операцію терміналу `.forEach(System.out::println)`.

Рішення доступне після 3 спроб

вправи#java.m7.l2.e3
Спроби: 0Завантаження…

Завершіть код, обчисливши суму всіх чисел у списку чисел за допомогою потоку та термінальної операції зменшення з початковим значенням 0. Виведіть суму.

Завантаження редактора…
Показати підказку

Використовуйте `numbers.stream().reduce(0, (a, b) -> a + b)` та виведіть отриману змінну.

Рішення доступне після 3 спроб