Как работает Stream API в Java и какие типы методов существуют
Что проверяют
Понимаете ли вы ленивость конвейера и различаете ли типы операций.
Как отвечать
Стрим это конвейер обработки последовательности. Он не хранит данные и не меняет источник, а описывает, что с ними сделать.
Три части: источник (collection.stream(), Arrays.stream, Stream.of, IntStream.range), промежуточные операции и терминальная.
Промежуточные возвращают стрим и ничего не выполняют: filter, map, flatMap, sorted, distinct, limit, skip, peek. Делятся на операции без состояния (обрабатывают элемент независимо) и с состоянием (sorted, distinct требуют увидеть больше одного элемента).
Терминальные запускают конвейер: collect, toList, forEach, reduce, count, min, max, anyMatch, findFirst. Часть из них замыкает вычисление досрочно: findFirst остановится на первом подходящем элементе.
Ленивость это не деталь реализации, а смысл: без терминальной операции не выполнится ничего, а элементы идут по конвейеру по одному, а не проходят каждый этап целиком.
Стрим одноразовый: повторное использование даёт исключение.
Полезно назвать примитивные варианты (IntStream, LongStream, DoubleStream), которые избавляют от упаковки, и Collectors для сборки: toMap, groupingBy, joining, partitioningBy.
Где спотыкаются
Ждут выполнения от цепочки без терминальной операции.
Пытаются пройти по стриму дважды.
Меняют внешнее состояние в map, ломая параллельный режим.
Не знают про примитивные стримы и упаковывают миллионы чисел без нужды.