Зачем ленивые последовательности
Вопрос
Нужно найти первые 5 строк лога с ошибкой в файле на миллион строк. Чем ленивый генератор лучше цепочки lines.filter(isError).slice(0, 5)?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
- Ничем: движок сам оптимизирует цепочку
filter().slice()до ленивой и прервёт обход - Генератор выполняется в отдельном потоке и не блокирует интерфейс при обходе файла
- Генератор проверит строки только до пятой ошибки и не создаст лишний массивправильный ответ
- Генератор автоматически кеширует найденное между запусками, и второй поиск мгновенный
Разбор
Методы массива жадные: filter создаёт новый массив, проверив все элементы, и только потом slice берёт первые пять. Генератор выдаёт значения по одному по запросу, и перебор можно остановить сразу после пятого найденного. Движок не превращает filter в ленивую операцию. Отдельного потока у генераторов нет, и кеша между запусками тоже. С ES2025 то же самое можно записать через iterator helpers: lines.values().filter(isError).take(5).toArray().
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.