← Назад к вопросам

Как определить промежуточную операцию?

1.0 Junior🔥 61 комментариев
#Основы Java

Комментарии (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 метод(...) -> терминальная

Примеры промежуточных операций

  1. filter(Predicate) - фильтрует элементы
  2. map(Function) - преобразует элементы
  3. flatMap(Function) - разворачивает потоки
  4. sorted(Comparator) - сортирует элементы
  5. distinct() - убирает дубликаты
  6. limit(long) - ограничивает количество
  7. skip(long) - пропускает элементы
  8. peek(Consumer) - просматривает элементы

Примеры терминальных операций

  1. collect(Collector) - собирает результат
  2. forEach(Consumer) - обрабатывает каждый
  3. count() - считает элементы
  4. findFirst() - находит первый
  5. findAny() - находит любой
  6. anyMatch(Predicate) - проверяет совпадение
  7. allMatch(Predicate) - все совпадают
  8. noneMatch(Predicate) - нет совпадений
  9. reduce(BinaryOperator) - агрегирует
  10. min(Comparator) - находит минимум
  11. max(Comparator) - находит максимум
  12. toArray() - преобразует в массив

Основное свойство: Ленивые вычисления

Промежуточные операции ленивы - не выполняются без терминальной.

Это не выполнится:

nums.stream()
    .filter(n -> n > 2)
    .map(n -> n * 2);

Это выполнится, потому что есть терминальная:

nums.stream()
    .filter(n -> n > 2)
    .map(n -> n * 2)
    .collect(Collectors.toList());

Как быстро определить

  1. Посмотри на тип возврата метода
  2. Если Stream -> промежуточная
  3. Если List, int, boolean, void -> терминальная
  4. Если можешь писать точку и еще метод -> промежуточная
  5. Если это последний метод -> скорее всего терминальная

Практический пример

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());
Как определить промежуточную операцию? | PrepBro