Spec-Zone.ru › Kotlin 1.7

Создание коллекций

Создание из элементов

Наиболее распространённый способ создания коллекции — использование стандартных функций библиотеки 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, см. Обзор операций над коллекциями.

Последнее изменение: 26 апреля 2022 г.
Обзор коллекций Итераторы

© 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

Spec-Zone.ru

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