Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
# Как определить промежуточную операцию
Определение
Промежуточная операция это операция Stream API, которая возвращает новый Stream.
Терминальная операция это операция, которая возвращает результат (не Stream) и завершает обработку.
Ключевое отличие
Промежуточная возвращает Stream, терминальная - нет.
Промежуточная: filter(), map(), sorted(), distinct(), limit(), skip(), flatMap()
Терминальная: collect(), forEach(), count(), findFirst(), anyMatch(), reduce()
Как определить по типу возврата
Если метод имеет сигнатуру:
- public Stream<T> метод(...) -> промежуточная
- public List/Integer/Boolean/void метод(...) -> терминальная
Примеры промежуточных операций
- filter(Predicate) - фильтрует элементы
- map(Function) - преобразует элементы
- flatMap(Function) - разворачивает потоки
- sorted(Comparator) - сортирует элементы
- distinct() - убирает дубликаты
- limit(long) - ограничивает количество
- skip(long) - пропускает элементы
- peek(Consumer) - просматривает элементы
Примеры терминальных операций
- collect(Collector) - собирает результат
- forEach(Consumer) - обрабатывает каждый
- count() - считает элементы
- findFirst() - находит первый
- findAny() - находит любой
- anyMatch(Predicate) - проверяет совпадение
- allMatch(Predicate) - все совпадают
- noneMatch(Predicate) - нет совпадений
- reduce(BinaryOperator) - агрегирует
- min(Comparator) - находит минимум
- max(Comparator) - находит максимум
- toArray() - преобразует в массив
Основное свойство: Ленивые вычисления
Промежуточные операции ленивы - не выполняются без терминальной.
Это не выполнится:
nums.stream()
.filter(n -> n > 2)
.map(n -> n * 2);
Это выполнится, потому что есть терминальная:
nums.stream()
.filter(n -> n > 2)
.map(n -> n * 2)
.collect(Collectors.toList());
Как быстро определить
- Посмотри на тип возврата метода
- Если Stream -> промежуточная
- Если List, int, boolean, void -> терминальная
- Если можешь писать точку и еще метод -> промежуточная
- Если это последний метод -> скорее всего терминальная
Практический пример
List<String> words = Arrays.asList("apple", "banana", "cherry");
List<String> result = words.stream()
.filter(w -> w.length() > 4) // Промежуточная
.map(String::toUpperCase) // Промежуточная
.sorted() // Промежуточная
.collect(Collectors.toList()); // Терминальная
Важно помнить
- Промежуточная позволяет цепировать дальше
- Терминальная завершает цепь
- Без терминальной ничего не выполнится
- Stream используется только один раз
- После терминальной операции Stream закрыт
Сигнатуры в Java API
Промежуточные всегда возвращают Stream:
public Stream<T> filter(...)
public Stream<T> map(...)
public Stream<T> sorted(...)
Терминальные возвращают результат:
public List<T> collect(...)
public void forEach(...)
public long count()
public Optional<T> findFirst()
public boolean anyMatch(...)
Ошибка: забыли терминальную операцию
Эта цепь не выполнится:
nums.stream()
.filter(n -> n > 2)
.map(n -> n * 2);
Правильно добавить терминальную:
nums.stream()
.filter(n -> n > 2)
.map(n -> n * 2)
.collect(Collectors.toList());