Получить доступ

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

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

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

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

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

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

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

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

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

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

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

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

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

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

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

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

Разбор темы

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

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем