Ответ вслух Middle Лямбды и Stream API спрашивают часто обновлено

Как работает Stream API

Вопрос

Расскажите, как устроены стримы в Java: ленивость, порядок обработки, когда стримы лучше циклов и когда хуже.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

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

Что должно прозвучать в ответе

  • Источник, промежуточные и терминальная операция

  • Ленивость: без терминальной ничего не выполняется

  • Элементы идут по конвейеру по одному, sorted собирает всё

  • Короткое замыкание: findFirst, anyMatch, limit

  • Одноразовость стрима

  • Без побочных эффектов; примитивные стримы против упаковки

Что могут спросить следом

  • Почему sorted ломает ленивость бесконечного стрима?
  • Что быстрее: цикл или стрим?
  • Как обработать checked-исключение внутри map?

Разбор

Стрим это конвейер: источник, ноль или больше промежуточных операций и одна терминальная. Промежуточные ленивые, они лишь описывают шаги, работа начинается на терминальной. Элементы идут по конвейеру по одному: первый проходит все стадии, потом второй, поэтому findFirst, anyMatch и limit могут остановиться рано и даже работать с бесконечным Stream.iterate. Исключение составляют операции с состоянием, sorted должен увидеть все элементы. Стрим одноразовый. Лямбды в стримах должны быть без побочных эффектов, результат собираю коллектором. Стримы хороши для декларативных преобразований коллекций: фильтр, группировка, агрегаты читаются лучше циклов. В горячих местах цикл бывает быстрее, а для чисел беру IntStream, чтобы не упаковывать. Checked-исключения в лямбдах неудобны, их оборачивают в unchecked или выносят в отдельный метод.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.