Коллекции в Kotlin

В Kotlin есть три основных разновидности коллекций – список (List), словарь (Map) и множество (Set). Множества содержат только уникальные значения, в них не может быть двух элементов с одинаковыми значениями, а порядок элементов не важен.

Коллекции – это классы-дженерики, поэтому при создании объектов явно указывается или компилятор сам выводит тип составляющих коллекцию объектов. Примеры объявлений переменных типов коллекций без связывания их с объектами:

fun main() {
    val c: List<Int>
    val d: Map<String, Int>
    val e: Set<Byte>
}

Здесь список и множество состоят из целых чисел, в словаре ключами являются строки, а значениями числа. Тип может быть родительским, например, Any. Тогда коллекция может содержать любой тип данных, однако необходимость в подобном возникает редко.

Обычно коллекции создаются не с помощью конструкторов, а вызовом специальных функций языка Kotlin – listOf(), mapOf(), setOf().

fun main() {
    val c = listOf(1, 4, 6, 1)
    val d = mapOf("apple" to 10, "orange" to 5)
    val e = setOf(3, 4, 5, 0)
}

Типы переменных можно опустить, так как компилятор способен их вывести сам из объектов.

Список можно создать с помощью конструктора. Это удобно, когда список длинный или заполняется одинаковыми значениями.

val c = List(10){0}

В примере будет создан список из десяти элементов, каждый элемент будет равен нулю. В фигурных скобках находится лямбда-выражение, которое может быть сложнее.

Создание списка в Kotlin с помощью конструктора List

В Kotlin интерфейсы List, Map и Set относятся к неизменяемым коллекциям. Другими словами, все, что приведено выше, не допускает изменения своих элементов.

Неизменяемый список

Если нужны изменяемые коллекции, создавать их следует от MutableList, MutableMap и MutableSet. Соответственно используются функции mutableListOf(), mutableMapOf(), mutableSetOf(). Изменяемые интерфейсы наследуют от своих неизменяемых интерфейсов + интерфейс MutableCollection (только для MutableList и MutableSet).

fun main() {
    val c = MutableList(10){0}
    c[0] = 109
 
    val a = mutableListOf<Int>()
    a.add(40)
 
    val b = mutableMapOf('a' to 10, 'b' to 5)
    b['c'] = 12
 
    for ((key, value) in b)
        println("$key = $value")
}

Коллекции относятся к итерируемым объектам, то есть у них есть метод iterator(), вызов которого создает объект-итератор. Этот метод вызывается неявно в заголовке цикла for.

Вызов метода iterator()

Класс ArrayList – конкретная реализация изменяемого списка. Используется по умолчанию. Его конструктор несколько иной, лямбда ему не передается.

fun main() {
    val a = ArrayList<String>()
    a.add("Hello")
    a.add("World")
 
    val b = setOf("hi", "oh")
    val c = ArrayList(b)
}

PDF-версия курса с дополнительными уроками

Приложение для Android "Kotlin. Курс"