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

API потока

Stream API в Java позволяет обрабатывать коллекции объектов декларативным способом, используя функциональное программирование. Stream не хранит данные, а переносит элементы из источника (например, списка или массива) через конвейер операций.

Конвейер 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): объединяет элементы Stream в одно совокупное значение.
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Загрузка…

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

Загрузка редактора…
Показать подсказку

Начните с вызова `numbers.stream()`, добавьте `.filter(n -> n % 2 == 0)` и, наконец, соберите с помощью `.collect(Collectors.toList())`.

Решение доступно после 3 попыток

Упражнение#java.m7.l2.e2
Попыток: 0Загрузка…

Используйте потоки для преобразования всех имен внутри списка имен в верхний регистр с помощью карты и распечатывайте их одно за другим с помощью forEach со ссылкой на метод.

Загрузка редактора…
Показать подсказку

Используйте `.map(s -> s.toUpperCase())`, за которым следует терминальная операция `.forEach(System.out::println)`.

Решение доступно после 3 попыток

Упражнение#java.m7.l2.e3
Попыток: 0Загрузка…

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

Загрузка редактора…
Показать подсказку

Используйте `numbers.stream().reduce(0, (a, b) -> a + b)` и напечатайте полученную переменную.

Решение доступно после 3 попыток