← Назад к вопросам
В чем разница между List и Sequence?
2.0 Middle🔥 141 комментариев
#Kotlin основы#Коллекции и структуры данных
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Разница между List и Sequence в Kotlin
List — Eager (Нетерпеливая) коллекция
List — это коллекция, которая вычисляет все элементы сразу при создании и хранит их в памяти.
Характеристики:
- Все операции выполняются немедленно
- Результаты сохраняются в памяти
- Доступ по индексу O(1)
- Возможна итерация несколько раз
val list = listOf(1, 2, 3, 4, 5)
.filter { it > 2 } // Вычисляется сразу
.map { it * 2 } // Вычисляется сразу
// [6, 8, 10]
Sequence — Lazy (Ленивая) коллекция
Sequence — это коллекция, которая вычисляет элементы по требованию (на лету), один за другим.
Характеристики:
- Операции выполняются отложенно (lazy)
- Элементы не сохраняются в промежуточных коллекциях
- Обработка от элемента к элементу
- Нельзя обращаться по индексу
val sequence = sequenceOf(1, 2, 3, 4, 5)
.filter { it > 2 } // Не выполняется
.map { it * 2 } // Не выполняется
.toList() // Теперь выполняются!
// [6, 8, 10]
Пример работы
// List — eager
val list = listOf(1, 2, 3, 4, 5)
val result = list
.filter { println("filter: $it"); it > 2 }
.map { println("map: $it"); it * 2 }
Сравнение
List вычисляет все элементы сразу:
- filter: 1, 2, 3, 4, 5
- map: 3, 4, 5
Sequence вычисляет по требованию:
- filter: 1 (нет), 2 (нет), 3 (да) → map: 3
- filter: 4 (да) → map: 4
- filter: 5 (да) → map: 5
Когда использовать?
List если:
- Маленькая коллекция (< 100 элементов)
- Нужен доступ по индексу
- Будете итерировать несколько раз
- Нужна максимальная скорость
Sequence если:
- Большая коллекция
- Много операций фильтрации и преобразования
- Нужна лишь часть результата
- Важна экономия памяти и процессорного времени
Практический пример
// List — обрабатывает всё
val bigList = (1..1_000_000).toList()
.filter { it % 2 == 0 } // Проверяет 500k элементов
.map { it * 2 } // Преобразует 500k
.take(10) // Берёт только 10!
// Sequence — обрабатывает нужное
val bigSequence = (1..1_000_000).asSequence()
.filter { it % 2 == 0 } // Проверяет до 20
.map { it * 2 } // Преобразует до 10
.take(10) // Останавливается после 10
Sequence значительно эффективнее для больших данных и цепочек операций.