Что такое стримы в Java и как они работают
Что проверяют
Понимаете ли вы ленивость и то, что стрим это конвейер обработки, а не коллекция.
Как отвечать
Стрим это последовательность элементов с конвейером операций. Он не хранит данные и не меняет источник, а описывает, что с ними сделать.
Операции делятся на два вида:
- промежуточные (
filter,map,sorted,distinct,limit): возвращают стрим и ничего не выполняют; - терминальные (
collect,forEach,reduce,count,anyMatch): запускают весь конвейер и завершают стрим.
Ленивость это не деталь, а смысл: без терминальной операции не выполнится ничего, а элементы проходят конвейер по одному, что позволяет findFirst остановиться на первом подходящем, не обработав остальные.
List<String> names = users.stream()
.filter(u -> u.getAge() >= 18)
.map(User::getName)
.sorted()
.toList();Стрим одноразовый: повторное использование даёт IllegalStateException.
Про parallelStream стоит сказать честно: он раскидывает работу по общему пулу ForkJoin, выигрывает только на больших объёмах и чистых функциях без побочных эффектов, а на маленьких коллекциях и на операциях ввода-вывода обычно проигрывает.
Где спотыкаются
Считают стрим коллекцией и пытаются пройти по нему дважды.
Меняют внешнее состояние внутри map или filter, из-за чего параллельный режим ломается непредсказуемо.
Ставят parallelStream для ускорения на списке из сотни элементов.
Не знают, что peek предназначен для отладки и может вообще не выполниться, если оптимизатор посчитает его лишним.