Создание коллекций
Создание из элементов
Наиболее распространённый способ создания коллекции — использование стандартных функций библиотеки 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–2022 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/constructing-collections.html