Ответ
Базовый паттерн работы со Stream API часто включает цепочку: filter() -> map() -> collect().
Типичный пример:
List<String> names = List.of("Alice", "Bob", "Charlie", "Anna");
List<String> result = names.stream() // Источник
.filter(name -> name.length() > 3) // Промежуточная операция: фильтрация
.map(String::toUpperCase) // Промежуточная операция: преобразование
.sorted() // Промежуточная операция: сортировка (опционально)
.collect(Collectors.toList()); // Терминальная операция: сбор в коллекцию
// Результат: ["ALICE", "CHARLIE", "ANNA"]
Назначение ключевых методов:
filter(Predicate<T>): Отбирает элементы, удовлетворяющие условию. Основа для выборки данных.map(Function<T, R>): Преобразует каждый элемент в другой объект. Ключевой метод для трансформации данных.collect(Collector): Завершает поток, собирая элементы в коллекцию (List, Set, Map) или сводя к одному значению. Без терминальной операции поток не выполнится.
Другие часто используемые методы:
sorted()/sorted(Comparator): Сортировка.distinct(): Удаление дубликатов.forEach(Consumer): Выполнение действия для каждого элемента (часто для сайд-эффектов).findFirst()/findAny(): Поиск элемента.flatMap(Function<T, Stream<R>>): "Разворачивает" вложенные структуры (например, Stream<List> в Stream ).