Вопрос проверяет умение выбирать подходящий инструмент в зависимости от контекста и понимание внутренних механизмов Stream API.
Stream API стоит использовать, когда важна читаемость и логика обработки данных, а не максимальная производительность. Цепочки filter / map сами по себе не выполняются сразу, а объединяются в один pipeline. Это снижает количество проходов по данным. Однако каждая операция добавляет накладные расходы, особенно при работе с примитивами без mapToInt. На больших объёмах данных это может быть заметно.
Stream API хорошо подходит не для всех задач. Его использование должно быть осознанным.
Перед применением стримов важно оценить характер задачи.
Сложная логика обработки
Несколько фильтров
Преобразования данных
Агрегации
Читаемость важнее скорости
Бизнес-логика
Код, который часто читают и поддерживают
Отсутствие побочных эффектов
Нет изменения внешнего состояния
Код легко тестировать
filter / mapStream не выполняет операции сразу.
Ленивая модель
filter и map не запускаются без терминальной операции.
Выполнение начинается только при forEach, collect, sum и т.д.
Pipeline
Элемент проходит через все операции последовательно.
Нет промежуточных коллекций.
Пример:
list.stream()
.filter(x -> x > 10)
.map(x -> x * 2)
.forEach(System.out::println);
Каждый элемент:
Проверяется filter
Преобразуется map
Передаётся в forEach
Плюсы
Один проход по данным
Возможность short-circuit (findFirst, anyMatch)
Минусы
Лямбды и вызовы методов
Boxing / unboxing без mapToInt, mapToLong
Хуже предсказуемость для JIT
Если внутри стрима есть:
простая арифметика
миллионы элементов
горячий участок кода
то обычный for часто будет быстрее.
Stream API — отличный инструмент для выразительного кода, но его не стоит использовать бездумно в критичных по скорости местах.