Вопрос с собеседования · Java

В конвейере стоят filter и map. Почему порядок filter перед map обычно предпочтительнее обратного?

MiddleЛямбды и Stream API
Коротко

Элементы идут по конвейеру по одному: дорогое преобразование до фильтра выполняется и для отбрасываемых элементов. Чем раньше отсеять, тем меньше работы.

  • Короткое замыкание: с findFirst и limit обработка останавливается рано
  • sorted до filter сортирует лишнее — фильтровать раньше
  • Если map нужен для условия — порядок вынужденный

А ещё peek помогает увидеть порядок обработки при отладке

Подробно

Стрим не выполняет операции пофазно над всей коллекцией — каждый элемент проходит всю цепочку до конца, после чего берётся следующий. Поэтому дорогое преобразование, поставленное до фильтра, выполняется и для отбрасываемых элементов. Ленивость даёт и более сильный эффект — короткое замыкание: findFirst, anyMatch или limit прекращают обработку, не дойдя до конца источника, что позволяет работать даже с бесконечными стримами. Автоматической перестановки операций стрим не делает: порядок ровно тот, что написан, поэтому оптимизация конвейера — забота автора. Отсюда практическое правило: сначала фильтруем и ограничиваем, потом преобразуем и сортируем.

Что хотят услышать

  • Поэлементная ленивая обработка.
  • Экономия работы.

Частые ошибки

  • Ставить sorted раньше filter и сортировать лишнее.
  • Рассчитывать, что рантайм переупорядочит операции.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗Порядок ни на что не влияет: стрим сам переставит операции оптимально
  • ✓Ранний filter избавляет от лишних вызовов map
  • ✗map нельзя вызывать раньше filter — это ошибка компиляции
  • ✗filter обязан идти первым, иначе конвейер не будет ленивым

Что спросят дальше

  • Как короткое замыкание позволяет работать с бесконечными стримами?
  • Почему sorted — операция с состоянием и чем это плохо?

Разбор темы

Связанные вопросы

Партнёр платформы

Разбор собеседования с sotto

После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.

Разбор собеседования