В Java Stream API метод collect() является терминальной операцией. Это значит, что он запускает обработку потока данных и собирает результат в какую-либо структуру данных, например, в List, Set или String.
Для определения того, как именно собирать данные, используется класс-помощник Collectors. Примеры:
.collect(Collectors.toList())— собирает элементы потока в список..collect(Collectors.joining())— объединяет элементы-строки в одну строку.
Этот урок научит вас материализовывать результаты работы стримов обратно в привычные коллекции Java.
- Модуль 1: Первая программа и структура
- Модуль 2: Переменные и типы данных
- Объявление и инициализация переменных.
- Примитивы: целые числа (int, long, byte, short).
- Примитивы: дробные числа (double, float).
- Примитивы: логический тип (boolean).
- Примитивы: символьный тип (char).
- String — основы работы со строками.
- Приведение типов (Casting): расширение и сужение.
- Область видимости переменных (Scope).
- Модуль 3: Операторы
- Модуль 4: Управляющие конструкции
- Модуль 5: Массивы и Строки (Advanced)
- Создание и заполнение массива.
- Доступ к элементам по индексу.
- Свойство length и перебор массива.
- Цикл for-each для массивов.
- Многомерные массивы.
- Методы String: length, charAt, isEmpty.
- Манипуляции: substring, concat, replace.
- Сравнение строк: equals vs ==.
- Разделение строк (split) и trim.
- StringBuilder (изменяемые строки).
- Модуль 6: Методы
- Модуль 7: Классы и Объекты (ООП Часть 1)
- Модуль 8: Капсуляция и Модификаторы
- Модуль 9: Наследование и Полиморфизм (ООП Часть 2)
- Модуль 10: Обработка исключений
- Модуль 11: Коллекции и Дженерики
- Модуль 12: Функциональный стиль (Java 8+)
- Модуль 13: Полезные стандарты
1. Сборка в список
В этом задании вам нужно дополнить код, который обрабатывает поток целых чисел, чтобы собрать результат в список. Используйте терминальную операцию `collect` с соответствующим коллектором из класса `Collectors`. Заполните пропуски в вызове метода так, чтобы программа корректно скомпилировалась и вывела список отфильтрованных чисел.
import java.util.List;
import java.util.Arrays;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(10, 20, 30, 40, 50);
List<Integer> filtered = numbers.stream()
.filter(n -> n > 25)
.input1S(Collectors.input2S());
System.out.println(filtered);
}
}2. Коллекторы и результаты
В левой колонке приведены примеры использования коллекторов из Stream API (методы класса Collectors). В правой колонке указаны типы данных, которые возвращают эти коллекторы. Сопоставьте каждый коллектор с типом возвращаемого результата. Обратите внимание, что в правой колонке нет лишних вариантов, но порядок перемешан.
Collectors.toList()Collectors.toSet()Collectors.joining(", ")Collectors.toMap(k -> k, v -> v)3. Цепочка стрима
Соберите Java-программу, которая создает список имен, фильтрует его, оставляя только имена, начинающиеся на букву "A", собирает результат в новый список и выводит его в консоль. Убедитесь, что тип переменной результата соответствует возвращаемому значению терминальной операции.
import java.util.List;import java.util.stream.Collectors;public class Main { public static void main(String[] args) { List<String> names = List.of("Ann", "Bob", "Alice"); List<String> result = names.stream() .filter(s -> s.startsWith("A")) .collect(Collectors.toList()); .collect(Collectors.toSet()); System.out.println(result); stream(names) }}4. Забытый класс Collectors
В приведённом фрагменте кода на Java используется Stream API для сбора элементов списка в новый список. Однако в методе collect допущена синтаксическая ошибка: отсутствует указание класса Collectors. Исправьте строку с ошибкой, чтобы код успешно компилировался и выполнял сборку элементов.
import java.util.List;import java.util.stream.Collectors;import java.util.stream.Stream; public class Main { public static void main(String[] args) { List<String> names = List.of("Alice", "Bob", "Charlie"); List<String> upperNames = names.stream() .map(String::toUpperCase) .collect(toList()); // Ошибка здесь System.out.println(upperNames); }}5. Результат joining
Проанализируйте приведённый фрагмент кода на Java, использующий Stream API и коллектор Collectors.joining(). Определите, какая строка будет выведена на экран в результате выполнения программы. Обратите внимание на исходный список строк и разделитель, указанный в методе joining.
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
List<String> words = Arrays.asList("Java", "Stream", "API");
String result = words.stream().collect(Collectors.joining("-"));
System.out.println(result);
}
}6. Терминальная операция
Внимательно изучите представленный фрагмент кода на Java, использующий Stream API. Ваша задача — найти и отметить кликом все вызовы терминальной операции `collect`, которые завершают поток и собирают результат. Не отмечайте промежуточные операции (такие как `filter`, `map`, `sorted`), другие терминальные операции (например, `forEach`) или любые другие элементы кода.
List<String> names = Arrays.asList("Anna", "Bob", "Alice", "David");
// Преобразование списка в поток и фильтрация
List<String> longNames = names.{{stream~|~t0}}()
.{{filter~|~t1}}(n -> n.length() > 3)
.{{collect~|~t2}}(Collectors.toList());
// Другая цепочка: сбор в строку
String result = names.stream()
.{{map~|~t3}}(String::toUpperCase)
.{{collect~|~t4}}(Collectors.joining(", "));
// Третья цепочка: группировка по длине
Map<Integer, List<String>> grouped = names.stream()
.{{sorted~|~t5}}()
.{{collect~|~t6}}(Collectors.groupingBy(String::length));
// Вывод результатов
longNames.{{forEach~|~t7}}(System.out::println);