Прямые ссылки на публичные уроки для быстрого старта и стабильной индексации lesson-страниц.
Коллекции — это группы с переменным количеством элементов (или нулём элементов). Объекты внутри, как правило, имеют единый тип. Корнем иерархии коллекций в Kotlin является класс Collection<T>.
| Тип | Описание |
|---|---|
List | Упорядоченный набор элементов с доступом по индексу. Допускаются дубликаты. |
Set | Коллекция уникальных элементов. Порядок не гарантирован. |
Map | Набор пар «ключ — значение». Ключи уникальны, значения могут повторяться. |
В этом уроке подробнее рассмотрим списки. Поведение похоже на работу с массивами, но есть существенные отличия.
| # | Массив | Список |
|---|---|---|
| 1 | Фиксированный размер — нельзя добавить или удалить элемент | Есть методы add() и remove() |
| 2 | Предоставляется классом Array<T> | List<T> — интерфейс с разными реализациями |
| 3 | Оптимизирован для примитивов (IntArray, CharArray и т.д.) | Такой оптимизации нет |
| 4 | Сравниваются адреса ячеек в памяти | Сравниваются сами значения |
Хорошей практикой считается использовать списки вместо массивов везде, где это позволяет техническая реализация. Однако с точки зрения производительности массивы имеют преимущество.
Неизменяемый список создаётся функцией listOf():
val list: List<Int> = listOf(4, 4, 2)
List<T> — базовый интерфейс для неизменяемых списков. Нельзя заменить элемент по индексу, а также добавить или удалить элементы.
Изменяемый список создаётся функцией mutableListOf(). Тип переменной — MutableList<T>:
val list: MutableList<Int> = mutableListOf(1, 2, 3)
MutableList<T> расширяет List<T>, добавляя возможность добавлять и удалять элементы.
Для примеров используем следующий изменяемый список:
val mutableList = mutableListOf(11, 15, 20, 12, 9, 14)
Добавляет элемент в список. Принимает один или два параметра:
// Добавить в конец списка mutableList.add(42) // Добавить по указанному индексу mutableList.add(0, 42) // 42 будет вставлен в начало
Проверяет наличие элемента в списке и возвращает Boolean:
println(mutableList.contains(42)) // true
Проверяют, содержит ли список хотя бы один элемент:
println(mutableList.isEmpty()) // false println(mutableList.isNotEmpty()) // true
Возвращают индекс элемента в списке. Если одинаковых значений несколько, indexOf() вернёт первое вхождение, lastIndexOf() — последнее:
println(mutableList.indexOf(42)) // 0 println(mutableList.lastIndexOf(42)) // 0
mutableList.sort() // сортировка по возрастанию mutableList.sortDescending() // сортировка по убыванию mutableList.reverse() // обратный порядок элементов
Для перебора всех элементов списка удобно использовать forEach():
mutableList.forEach { println(it) }
Переменную it можно переименовать для повышения читабельности:
mutableList.forEach { ingredient -> println(ingredient) }
Когда использовать for, а когда forEach:
for.forEach.break или continue — цикл for.Фильтрует коллекцию по условию и возвращает новый список. Исходный список не изменяется:
val mutableList2 = mutableList.filter { it == 42 } mutableList2.forEach { println(it) }
Каждый элемент проверяется на соответствие условию. Если результат true — элемент попадает в новый список.
Применяет преобразование ко всем элементам и возвращает новый список с результатами:
val mutableList3 = mutableList2.map { it * 2 } println(mutableList3) // [84, 84]
map() удобна, когда нужно трансформировать все элементы коллекции без изменения исходного списка.