В конвейере стоят filter и map. Почему порядок filter перед map обычно предпочтительнее обратного?
Элементы идут по конвейеру по одному: дорогое преобразование до фильтра выполняется и для отбрасываемых элементов. Чем раньше отсеять, тем меньше работы.
- Короткое замыкание: с findFirst и limit обработка останавливается рано
- sorted до filter сортирует лишнее — фильтровать раньше
- Если map нужен для условия — порядок вынужденный
А ещё peek помогает увидеть порядок обработки при отладке
Подробно
Стрим не выполняет операции пофазно над всей коллекцией — каждый элемент проходит всю цепочку до конца, после чего берётся следующий. Поэтому дорогое преобразование, поставленное до фильтра, выполняется и для отбрасываемых элементов. Ленивость даёт и более сильный эффект — короткое замыкание: findFirst, anyMatch или limit прекращают обработку, не дойдя до конца источника, что позволяет работать даже с бесконечными стримами. Автоматической перестановки операций стрим не делает: порядок ровно тот, что написан, поэтому оптимизация конвейера — забота автора. Отсюда практическое правило: сначала фильтруем и ограничиваем, потом преобразуем и сортируем.
Что хотят услышать
- Поэлементная ленивая обработка.
- Экономия работы.
Частые ошибки
- Ставить sorted раньше filter и сортировать лишнее.
- Рассчитывать, что рантайм переупорядочит операции.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Порядок ни на что не влияет: стрим сам переставит операции оптимально
- ✓Ранний filter избавляет от лишних вызовов map
- ✗map нельзя вызывать раньше filter — это ошибка компиляции
- ✗filter обязан идти первым, иначе конвейер не будет ленивым
Что спросят дальше
- Как короткое замыкание позволяет работать с бесконечными стримами?
- Почему sorted — операция с состоянием и чем это плохо?
Разбор темы
- Stream API: устройство и ленивый конвейер
Что такое стрим, источники, промежуточные против терминальных, ленивость и short-circuiting, stateful-операции, параллельность и примитивные стримы.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.