Как работает Stream API
Вопрос
Расскажите, как устроены стримы в Java: ленивость, порядок обработки, когда стримы лучше циклов и когда хуже.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Источник, промежуточные и терминальная операция
Ленивость: без терминальной ничего не выполняется
Элементы идут по конвейеру по одному, sorted собирает всё
Короткое замыкание: findFirst, anyMatch, limit
Одноразовость стрима
Без побочных эффектов; примитивные стримы против упаковки
Что могут спросить следом
- Почему
sortedломает ленивость бесконечного стрима? - Что быстрее: цикл или стрим?
- Как обработать checked-исключение внутри map?
Разбор
Стрим это конвейер: источник, ноль или больше промежуточных операций и одна терминальная. Промежуточные ленивые, они лишь описывают шаги, работа начинается на терминальной. Элементы идут по конвейеру по одному: первый проходит все стадии, потом второй, поэтому findFirst, anyMatch и limit могут остановиться рано и даже работать с бесконечным Stream.iterate. Исключение составляют операции с состоянием, sorted должен увидеть все элементы. Стрим одноразовый. Лямбды в стримах должны быть без побочных эффектов, результат собираю коллектором. Стримы хороши для декларативных преобразований коллекций: фильтр, группировка, агрегаты читаются лучше циклов. В горячих местах цикл бывает быстрее, а для чисел беру IntStream, чтобы не упаковывать. Checked-исключения в лямбдах неудобны, их оборачивают в unchecked или выносят в отдельный метод.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.