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