Уроки модуля (2/2)
API потока
Stream API в Java позволяет обрабатывать коллекции объектов декларативным способом, используя функциональное программирование. Stream не хранит данные, а переносит элементы из источника (например, списка или массива) через конвейер операций.
Конвейер Stream состоит из трех частей:
- источник (например,
list.stream()). - Ноль или более промежуточных операций (которые возвращают новый поток, например,
filter,map). - терминальная операция (которая дает окончательный результат или побочный эффект и закрывает поток, например,
collect,forEach,reduce)
Общие промежуточные операции
Промежуточные операции являются ленивыми: они не выполняются до тех пор, пока не будет вызвана терминальная операция.
filter(Predicate): фильтрует элементы на основе логического условия.map(Function): преобразует каждый элемент в другой объект путем применения функции.sorted(): сортирует элементы потока.
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 в одно совокупное значение.
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
int sum = numbers.stream()
.reduce(0, (a, b) -> a + b); // Sums all numbers: 10Попробуйте сами
Завершите код, используя поток чисел для фильтрации только четных чисел, соберите их в новый список с именем Evens и распечатайте его с помощью System.out.println.
Показать подсказку
Начните с вызова `numbers.stream()`, добавьте `.filter(n -> n % 2 == 0)` и, наконец, соберите с помощью `.collect(Collectors.toList())`.
Решение доступно после 3 попыток
Используйте потоки для преобразования всех имен внутри списка имен в верхний регистр с помощью карты и распечатывайте их одно за другим с помощью forEach со ссылкой на метод.
Показать подсказку
Используйте `.map(s -> s.toUpperCase())`, за которым следует терминальная операция `.forEach(System.out::println)`.
Решение доступно после 3 попыток
Завершите код, вычислив сумму всех чисел в списке чисел с помощью Stream и операции сокращения терминала с начальным значением 0. Выведите сумму.
Показать подсказку
Используйте `numbers.stream().reduce(0, (a, b) -> a + b)` и напечатайте полученную переменную.
Решение доступно после 3 попыток