Spec-Zone.ru › Kotlin 2

Коллекции

При программировании полезно группировать данные в структуры для последующей обработки. Именно для этого в Kotlin предусмотрены коллекции.

В Kotlin есть следующие коллекции для группировки элементов:

Тип коллекции

Описание

Списки

Упорядоченные коллекции элементов

Множества

Неупорядоченные коллекции уникальных элементов

Отображения

Наборы пар «ключ — значение», где ключи уникальны и каждому ключу соответствует только одно значение

Каждый тип коллекции может быть изменяемым или доступным только для чтения.

Список

Списки хранят элементы в порядке их добавления и допускают наличие повторяющихся элементов.

Чтобы создать список только для чтения (List), используйте функцию listOf().

Чтобы создать изменяемый список (MutableList), используйте функцию mutableListOf().

При создании списков Kotlin может вывести тип хранящихся в них элементов. Чтобы явно указать тип, добавьте его в угловых скобках <> после объявления списка:

fun main() { 
//sampleStart
    // Read only list
    val readOnlyShapes = listOf("triangle", "square", "circle")
    println(readOnlyShapes)
    // [triangle, square, circle]
    
    // Mutable list with explicit type declaration
    val shapes: MutableList<String> = mutableListOf("triangle", "square", "circle")
    println(shapes)
    // [triangle, square, circle]
//sampleEnd
}

Чтобы избежать нежелательных изменений, можно создать доступное только для чтения представление изменяемого списка, присвоив его переменной типа List:

    val shapes: MutableList<String> = mutableListOf("triangle", "square", "circle")
    val shapesLocked: List<String> = shapes

Это также называется приведением типа.

Списки упорядочены, поэтому для доступа к элементу списка используйте оператор индексированного доступа []:

fun main() { 
//sampleStart
    val readOnlyShapes = listOf("triangle", "square", "circle")
    println("The first item in the list is: ${readOnlyShapes[0]}")
    // The first item in the list is: triangle
//sampleEnd
}

Чтобы получить первый или последний элемент списка, используйте соответственно функции .first() и .last():

fun main() { 
//sampleStart
    val readOnlyShapes = listOf("triangle", "square", "circle")
    println("The first item in the list is: ${readOnlyShapes.first()}")
    // The first item in the list is: triangle
//sampleEnd
}

Функции .first() и .last() — примеры функций-расширений. Чтобы вызвать функцию-расширение для объекта, укажите её имя после объекта, поставив точку .

Функции-расширения подробно рассматриваются в промежуточном туре. Пока достаточно знать, как их вызывать.

Чтобы получить количество элементов в списке, используйте функцию .count():

fun main() { 
//sampleStart
    val readOnlyShapes = listOf("triangle", "square", "circle")
    println("This list has ${readOnlyShapes.count()} items")
    // This list has 3 items
//sampleEnd
}

Чтобы проверить, содержится ли элемент в списке, используйте оператор in:

fun main() {
//sampleStart
    val readOnlyShapes = listOf("triangle", "square", "circle")
    println("circle" in readOnlyShapes)
    // true
//sampleEnd
}

Чтобы добавлять элементы в изменяемый список или удалять их из него, используйте соответственно функции .add() и .remove():

fun main() { 
//sampleStart
    val shapes: MutableList<String> = mutableListOf("triangle", "square", "circle")
    // Add "pentagon" to the list
    shapes.add("pentagon") 
    println(shapes)  
    // [triangle, square, circle, pentagon]

    // Remove the first "pentagon" from the list
    shapes.remove("pentagon") 
    println(shapes)  
    // [triangle, square, circle]
//sampleEnd
}

Множество

В отличие от списков, которые упорядочены и допускают повторяющиеся элементы, множества являются неупорядоченными и содержат только уникальные элементы.

Чтобы создать множество только для чтения (Set), используйте функцию setOf().

Чтобы создать изменяемое множество (MutableSet), используйте функцию mutableSetOf().

При создании множеств Kotlin может вывести тип хранящихся в них элементов. Чтобы явно указать тип, добавьте его в угловых скобках <> после объявления множества:

fun main() {
//sampleStart
    // Read-only set
    val readOnlyFruit = setOf("apple", "banana", "cherry", "cherry")
    // Mutable set with explicit type declaration
    val fruit: MutableSet<String> = mutableSetOf("apple", "banana", "cherry", "cherry")
    
    println(readOnlyFruit)
    // [apple, banana, cherry]
//sampleEnd
}

В предыдущем примере видно, что повторяющийся элемент "cherry" был отброшен, поскольку множества содержат только уникальные элементы.

Чтобы избежать нежелательных изменений, можно создать доступное только для чтения представление изменяемого множества, присвоив его переменной типа Set:

    val fruit: MutableSet<String> = mutableSetOf("apple", "banana", "cherry", "cherry")
    val fruitLocked: Set<String> = fruit

Поскольку множества являются неупорядоченными, обратиться к элементу по определённому индексу нельзя.

Чтобы получить количество элементов во множестве, используйте функцию .count():

fun main() { 
//sampleStart
    val readOnlyFruit = setOf("apple", "banana", "cherry", "cherry")
    println("This set has ${readOnlyFruit.count()} items")
    // This set has 3 items
//sampleEnd
}

Чтобы проверить, содержится ли элемент во множестве, используйте оператор in:

fun main() {
//sampleStart
    val readOnlyFruit = setOf("apple", "banana", "cherry", "cherry")
    println("banana" in readOnlyFruit)
    // true
//sampleEnd
}

Чтобы добавлять элементы в изменяемое множество или удалять их из него, используйте соответственно функции .add() и .remove():

fun main() { 
//sampleStart
    val fruit: MutableSet<String> = mutableSetOf("apple", "banana", "cherry", "cherry")
    fruit.add("dragonfruit")    // Add "dragonfruit" to the set
    println(fruit)              // [apple, banana, cherry, dragonfruit]
    
    fruit.remove("dragonfruit") // Remove "dragonfruit" from the set
    println(fruit)              // [apple, banana, cherry]
//sampleEnd
}

Отображение

Отображения хранят элементы в виде пар «ключ — значение». Получить значение можно, указав ключ. Можно представить отображение в виде меню ресторана. Чтобы узнать цену (значение), нужно найти блюдо (ключ), которое вы хотите заказать. Отображения полезны, если нужно найти значение без использования числового индекса, как в списке.

  • Все ключи в отображении должны быть уникальными, чтобы Kotlin мог определить, какое значение нужно получить.

  • В отображении могут быть повторяющиеся значения.

Чтобы создать отображение только для чтения (Map), используйте функцию mapOf().

Чтобы создать изменяемое отображение (MutableMap), используйте функцию mutableMapOf().

При создании отображений Kotlin может вывести тип хранящихся в них элементов. Чтобы явно указать типы, добавьте типы ключей и значений в угловых скобках <> после объявления отображения. Например: MutableMap<String, Int>. Тип ключей — String, а тип значений — Int.

Самый простой способ создать отображение — использовать to между каждым ключом и соответствующим ему значением:

fun main() {
//sampleStart
    // Read-only map
    val readOnlyJuiceMenu = mapOf("apple" to 100, "kiwi" to 190, "orange" to 100)
    println(readOnlyJuiceMenu)
    // {apple=100, kiwi=190, orange=100}

    // Mutable map with explicit type declaration
    val juiceMenu: MutableMap<String, Int> = mutableMapOf("apple" to 100, "kiwi" to 190, "orange" to 100)
    println(juiceMenu)
    // {apple=100, kiwi=190, orange=100}
//sampleEnd
}

Чтобы избежать нежелательных изменений, можно создать доступное только для чтения представление изменяемого отображения, присвоив его переменной типа Map:

    val juiceMenu: MutableMap<String, Int> = mutableMapOf("apple" to 100, "kiwi" to 190, "orange" to 100)
    val juiceMenuLocked: Map<String, Int> = juiceMenu

Чтобы получить значение из отображения, используйте оператор индексированного доступа [] с соответствующим ключом:

fun main() {
//sampleStart
    // Read-only map
    val readOnlyJuiceMenu = mapOf("apple" to 100, "kiwi" to 190, "orange" to 100)
    println("The value of apple juice is: ${readOnlyJuiceMenu["apple"]}")
    // The value of apple juice is: 100
//sampleEnd
}

Если попытаться получить пару «ключ — значение» по ключу, которого нет в отображении, вы увидите значение null:

fun main() {
//sampleStart
    // Read-only map
    val readOnlyJuiceMenu = mapOf("apple" to 100, "kiwi" to 190, "orange" to 100)
    println("The value of pineapple juice is: ${readOnlyJuiceMenu["pineapple"]}")
    // The value of pineapple juice is: null
//sampleEnd
}

В этом туре значения null рассматриваются позже, в главе Безопасность работы с null.

Также можно использовать оператор индексированного доступа [] для добавления элементов в изменяемое отображение:

fun main() {
//sampleStart
    val juiceMenu: MutableMap<String, Int> = mutableMapOf("apple" to 100, "kiwi" to 190, "orange" to 100)
    juiceMenu["coconut"] = 150 // Add key "coconut" with value 150 to the map
    println(juiceMenu)
    // {apple=100, kiwi=190, orange=100, coconut=150}
//sampleEnd
}

Чтобы удалить элементы из изменяемого отображения, используйте функцию .remove():

fun main() {
//sampleStart
    val juiceMenu: MutableMap<String, Int> = mutableMapOf("apple" to 100, "kiwi" to 190, "orange" to 100)
    juiceMenu.remove("orange")    // Remove key "orange" from the map
    println(juiceMenu)
    // {apple=100, kiwi=190}
//sampleEnd
}

Чтобы получить количество элементов в отображении, используйте функцию .count():

fun main() {
//sampleStart
    // Read-only map
    val readOnlyJuiceMenu = mapOf("apple" to 100, "kiwi" to 190, "orange" to 100)
    println("This map has ${readOnlyJuiceMenu.count()} key-value pairs")
    // This map has 3 key-value pairs
//sampleEnd
}

Чтобы проверить, содержится ли определённый ключ в отображении, используйте функцию .containsKey():

fun main() {
//sampleStart
    val readOnlyJuiceMenu = mapOf("apple" to 100, "kiwi" to 190, "orange" to 100)
    println(readOnlyJuiceMenu.containsKey("kiwi"))
    // true
//sampleEnd
}

Чтобы получить коллекцию ключей или значений отображения, используйте соответственно свойства keys и values:

fun main() {
//sampleStart
    val readOnlyJuiceMenu = mapOf("apple" to 100, "kiwi" to 190, "orange" to 100)
    println(readOnlyJuiceMenu.keys)
    // [apple, kiwi, orange]
    println(readOnlyJuiceMenu.values)
    // [100, 190, 100]
//sampleEnd
}

Свойства keys и values — примеры свойств объекта. Чтобы обратиться к свойству объекта, укажите его имя после объекта, поставив точку .

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

Чтобы проверить, содержится ли ключ или значение в отображении, используйте оператор in:

fun main() {
//sampleStart
    val readOnlyJuiceMenu = mapOf("apple" to 100, "kiwi" to 190, "orange" to 100)
    println("orange" in readOnlyJuiceMenu.keys)
    // true
    
    // Alternatively, you don't need to use the keys property
    println("orange" in readOnlyJuiceMenu)
    // true
    
    println(200 in readOnlyJuiceMenu.values)
    // false
//sampleEnd
}

Дополнительную информацию о возможностях коллекций см. в разделе Коллекции.

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

Практика

Упражнение 1

У вас есть список «зелёных» чисел и список «красных» чисел. Дополните код, чтобы вывести общее количество чисел.

fun main() {
    val greenNumbers = listOf(1, 4, 23)
    val redNumbers = listOf(17, 2)
    // Write your code here
}
fun main() { val greenNumbers = listOf(1, 4, 23) val redNumbers = listOf(17, 2) val totalCount = greenNumbers.count() + redNumbers.count() println(totalCount) }

Упражнение 2

У вас есть набор протоколов, поддерживаемых сервером. Пользователь запрашивает использование определённого протокола. Дополните программу, чтобы проверить, поддерживается ли запрошенный протокол (isSupported должно быть логическим значением).

fun main() {
    val SUPPORTED = setOf("HTTP", "HTTPS", "FTP")
    val requested = "smtp"
    val isSupported = // Write your code here 
    println("Support for $requested: $isSupported")
}
Подсказка

Проверьте запрошенный протокол в верхнем регистре. Для этого можно использовать функцию .uppercase().

fun main() { val SUPPORTED = setOf("HTTP", "HTTPS", "FTP") val requested = "smtp" val isSupported = requested.uppercase() in SUPPORTED println("Support for $requested: $isSupported") }

Упражнение 3

Создайте отображение, связывающее целые числа от 1 до 3 с их написанием словами. Используйте это отображение, чтобы написать заданное число словами.

fun main() {
    val number2word = // Write your code here
    val n = 2
    println("$n is spelled as '${<Write your code here >}'")
}
fun main() { val number2word = mapOf(1 to "one", 2 to "two", 3 to "three") val n = 2 println("$n is spelled as '${number2word[n]}'") }
  • Предыдущий шаг

  • Следующий шаг

1 сентября 2026 г.
Основные типыПоток управления

© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/kotlin-tour-collections.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API