Sequence и производительность коллекций
Вопрос
Расскажи, как работают операции над коллекциями в Kotlin и когда ты переходишь на Sequence.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Операции над Iterable жадные, каждая создаёт новый список
Sequence ленивая, элемент проходит всю цепочку
Нужна терминальная операция, без неё ничего не выполнится
Выгодна на больших данных и с ранним выходом
На маленьких коллекциях список быстрее
Похожа на Java Stream, но без параллельности
Что могут спросить следом
- В каком порядке вызовутся map и filter для Sequence?
- Что делает sorted на последовательности?
- Как сделать бесконечную последовательность?
Разбор
Стандартные операции над списками в Kotlin жадные: map проходит всю коллекцию и создаёт новый список, потом filter создаёт ещё один. Это просто и быстро на небольших данных, но на миллионе элементов с цепочкой из пяти операций получаем пять промежуточных списков. Sequence ленивая: каждый элемент проходит всю цепочку целиком, промежуточных коллекций нет, и если в конце first или take, обработка останавливается рано. Вычисление запускает только терминальная операция вроде toList, sum или first. Я беру последовательность, когда данных много, цепочка длинная или есть ранний выход, а также для бесконечных генераторов через generateSequence. Для пары операций на сотне элементов оставляю список: у последовательности накладные расходы на итераторы. И помню, что sorted всё равно соберёт всё в память.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.