Создание коллекций
Создание из элементов
Чаще всего коллекции создают с помощью стандартных функций библиотеки listOf<T>(), setOf<T>(), mutableListOf<T>(), mutableSetOf<T>(). Если передать в качестве аргументов элементы коллекции, разделённые запятыми, компилятор автоматически определит тип элементов. При создании пустых коллекций укажите тип явно.
val numbersSet = setOf("one", "two", "three", "four")
val emptySet = mutableSetOf<String>()
Аналогичные функции для карт — mapOf() и mutableMapOf(). Ключи и значения карты передаются в виде объектов Pair (обычно создаваемых с помощью инфиксной функции to).
val numbersMap = mapOf("key1" to 1, "key2" to 2, "key3" to 3, "key4" to 1)
Обратите внимание, что запись to создаёт временный объект Pair, поэтому её рекомендуется использовать, только если производительность не критична. Чтобы избежать чрезмерного расхода памяти, используйте альтернативные способы. Например, можно создать изменяемую карту и заполнить её с помощью операций записи. Функция apply() поможет сохранить лаконичность инициализации.
val numbersMap = mutableMapOf<String, String>().apply { this["one"] = "1"; this["two"] = "2" }
Создание с помощью функций-конструкторов коллекций
Ещё один способ создать коллекцию — вызвать функцию-конструктор: buildList(), buildSet() или buildMap(). Они создают новую изменяемую коллекцию соответствующего типа, заполняют её с помощью операций записи и возвращают доступную только для чтения коллекцию с теми же элементами:
val map = buildMap { // this is MutableMap<String, Int>, types of key and value are inferred from the `put()` calls below
put("a", 1)
put("b", 0)
put("c", 4)
}
println(map) // {a=1, b=0, c=4}
Пустые коллекции
Существуют также функции для создания коллекций без элементов: emptyList(), emptySet() и emptyMap(). При создании пустых коллекций следует указать тип элементов, которые будут в них храниться.
val empty = emptyList<String>()
Функции-инициализаторы для списков
Для списков предусмотрена функция, подобная конструктору: она принимает размер списка и функцию-инициализатор, которая определяет значение элемента по его индексу.
fun main() {
//sampleStart
val doubled = List(3, { it * 2 }) // or MutableList if you want to change its content later
println(doubled)
//sampleEnd
}
Конструкторы конкретных типов
Для создания коллекции конкретного типа, например ArrayList или LinkedList, можно использовать доступные конструкторы этих типов. Аналогичные конструкторы доступны для реализаций Set и Map.
val linkedList = LinkedList<String>(listOf("one", "two", "three"))
val presizedSet = HashSet<Int>(32)
Копирование
Чтобы создать коллекцию с теми же элементами, что и в существующей коллекции, можно воспользоваться функциями копирования. Функции копирования коллекций из стандартной библиотеки создают поверхностные копии, содержащие ссылки на те же элементы. Поэтому изменение элемента коллекции отражается во всех её копиях.
Функции копирования коллекций, такие как toList(), toMutableList(), toSet() и другие, создают снимок коллекции в определённый момент времени. В результате получается новая коллекция с теми же элементами. Добавление или удаление элементов исходной коллекции не повлияет на копии. Копии также можно изменять независимо от исходной коллекции.
class Person(var name: String)
fun main() {
//sampleStart
val alice = Person("Alice")
val sourceList = mutableListOf(alice, Person("Bob"))
val copyList = sourceList.toList()
sourceList.add(Person("Charles"))
alice.name = "Alicia"
println("First item's name is: ${sourceList[0].name} in source and ${copyList[0].name} in copy")
println("List size is: ${sourceList.size} in source and ${copyList.size} in copy")
//sampleEnd
}
Эти функции также можно использовать для преобразования коллекций в другие типы, например для создания множества из списка или наоборот.
fun main() {
//sampleStart
val sourceList = mutableListOf(1, 2, 3)
val copySet = sourceList.toMutableSet()
copySet.add(3)
copySet.add(4)
println(copySet)
//sampleEnd
}
Кроме того, можно создать новые ссылки на тот же экземпляр коллекции. Новые ссылки создаются при инициализации переменной коллекции с помощью существующей коллекции. Поэтому изменения экземпляра коллекции через одну ссылку отражаются во всех остальных ссылках на него.
fun main() {
//sampleStart
val sourceList = mutableListOf(1, 2, 3)
val referenceList = sourceList
referenceList.add(4)
println("Source size: ${sourceList.size}")
//sampleEnd
}
Инициализацию коллекции можно использовать для ограничения возможности её изменения. Например, если создать ссылку List на MutableList, компилятор выдаст ошибки при попытке изменить коллекцию через эту ссылку.
fun main() {
//sampleStart
val sourceList = mutableListOf(1, 2, 3)
val referenceList: List<Int> = sourceList
//referenceList.add(4) //compilation error
sourceList.add(4)
println(referenceList) // shows the current state of sourceList
//sampleEnd
}
Вызов функций для других коллекций
Коллекции можно создавать в результате различных операций над другими коллекциями. Например, фильтрация списка создаёт новый список элементов, соответствующих условию фильтра:
fun main() {
//sampleStart
val numbers = listOf("one", "two", "three", "four")
val longerThan3 = numbers.filter { it.length > 3 }
println(longerThan3)
//sampleEnd
}
Преобразование создаёт список из результатов преобразования:
fun main() {
//sampleStart
val numbers = setOf(1, 2, 3)
println(numbers.map { it * 3 })
println(numbers.mapIndexed { idx, value -> value * idx })
//sampleEnd
}
Ассоциирование создаёт карты:
fun main() {
//sampleStart
val numbers = listOf("one", "two", "three", "four")
println(numbers.associateWith { it.length })
//sampleEnd
}
Дополнительные сведения об операциях над коллекциями в Kotlin см. в разделе Обзор операций над коллекциями.
© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/constructing-collections.html