Spec-Zone.ru › Kotlin 1.8

Получение отдельных элементов

Коллекции Kotlin предоставляют набор функций для извлечения отдельных элементов из коллекций. Функции, описанные на этой странице, применяются как к спискам, так и к множествам.

Как сказано в определении списка, список — это упорядоченная коллекция. Следовательно, каждый элемент списка имеет свою позицию, которую вы можете использовать для ссылки. В дополнение к функциям, описанным на этой странице, списки предлагают более широкий набор способов извлечения и поиска элементов по индексам. Более подробную информацию см. в операциях, специфичных для списков.

В свою очередь, множество не является упорядоченной коллекцией по определению. Однако Kotlin Set хранит элементы в определенном порядке. Это может быть порядок вставки (в LinkedHashSet), естественный порядок сортировки (в SortedSet) или другой порядок. Порядок элементов множества также может быть неизвестен. В таких случаях элементы все равно упорядочены каким-то образом, поэтому функции, которые полагаются на позиции элементов, по-прежнему возвращают свои результаты. Однако такие результаты непредсказуемы для вызывающей стороны, если она не знает конкретной реализации Set используемой.

Получение по позиции

Для извлечения элемента в определенной позиции существует функция elementAt(). Вызовите её с целым числом в качестве аргумента, и вы получите элемент коллекции в данной позиции. Первый элемент имеет позицию 0, а последний — (size - 1).

elementAt() полезна для коллекций, которые не предоставляют индексированный доступ или чьи возможности индексированного доступа неизвестны статически. В случае List, более подходящим является использование оператора индексированного доступа (оператора индексированного доступа) (get() или []).

fun main() {
//sampleStart
    val numbers = linkedSetOf("one", "two", "three", "four", "five")
    println(numbers.elementAt(3))    

    val numbersSortedSet = sortedSetOf("one", "two", "three", "four")
    println(numbersSortedSet.elementAt(0)) // elements are stored in the ascending order
//sampleEnd
}

Также существуют полезные алиасы для получения первого и последнего элемента коллекции: first() и last().

fun main() {
//sampleStart
    val numbers = listOf("one", "two", "three", "four", "five")
    println(numbers.first())    
    println(numbers.last())    
//sampleEnd
}

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

  • elementAtOrNull() возвращает null, когда указанная позиция выходит за пределы коллекции.

  • elementAtOrElse() дополнительно принимает лямбда-функцию, которая отображает аргумент Int в экземпляр типа элемента коллекции. При вызове с позицией за пределами границ elementAtOrElse() возвращает результат лямбда-функции для данного значения.

fun main() {
//sampleStart
    val numbers = listOf("one", "two", "three", "four", "five")
    println(numbers.elementAtOrNull(5))
    println(numbers.elementAtOrElse(5) { index -> "The value for index $index is undefined"})
//sampleEnd
}

Получение по условию

Функции first() и last() также позволяют искать в коллекции элементы, соответствующие заданному предикату. При вызове first() с предикатом, проверяющим элемент коллекции, вы получите первый элемент, для которого предикат возвращает true. В свою очередь, last() с предикатом возвращает последний соответствующий ему элемент.

fun main() {
//sampleStart
    val numbers = listOf("one", "two", "three", "four", "five", "six")
    println(numbers.first { it.length > 3 })
    println(numbers.last { it.startsWith("f") })
//sampleEnd
}

Если элементы, соответствующие предикату, отсутствуют, обе функции выбрасывают исключения. Чтобы избежать их, используйте firstOrNull() и lastOrNull() вместо них: они возвращают null в случае отсутствия соответствующих элементов.

fun main() {
//sampleStart
    val numbers = listOf("one", "two", "three", "four", "five", "six")
    println(numbers.firstOrNull { it.length > 6 })
//sampleEnd
}

Используйте алиасы, если их имена лучше подходят для вашей ситуации:

  • find() вместо firstOrNull()

  • findLast() вместо lastOrNull()

fun main() {
//sampleStart
    val numbers = listOf(1, 2, 3, 4)
    println(numbers.find { it % 2 == 0 })
    println(numbers.findLast { it % 2 == 0 })
//sampleEnd
}

Получение с селектором

Если вам нужно отобразить коллекцию перед извлечением элемента, существует функция firstNotNullOf(). Она объединяет 2 действия:

  • Отображает коллекцию с помощью функции селектора

  • Возвращает первое ненулевое значение в результате

firstNotNullOf() вызывает NoSuchElementException если результирующая коллекция не содержит ненулевого элемента. Используйте соответствующую функцию firstNotNullOfOrNull(), чтобы вернуть null в этом случае.

fun main() {
//sampleStart
    val list = listOf<Any>(0, "true", false)
    // Converts each element to string and returns the first one that has required length
    val longEnough = list.firstNotNullOf { item -> item.toString().takeIf { it.length >= 4 } }
    println(longEnough)
//sampleEnd
}

Случайный элемент

Если вам нужно получить произвольный элемент коллекции, вызовите функцию random(). Вы можете вызвать её без аргументов или с объектом Random в качестве источника случайности.

fun main() {
//sampleStart
    val numbers = listOf(1, 2, 3, 4)
    println(numbers.random())
//sampleEnd
}

Для пустых коллекций random() вызывает исключение. Чтобы получить null вместо этого, используйте randomOrNull()

Проверка существования элемента

Чтобы проверить наличие элемента в коллекции, используйте функцию contains(). Она возвращает true , если в коллекции существует элемент, который equals() аргумент функции. Вы можете вызвать contains() в операторной форме с ключевым словом in.

Чтобы проверить наличие сразу нескольких экземпляров, вызовите containsAll() с коллекцией этих экземпляров в качестве аргумента.

fun main() {
//sampleStart
    val numbers = listOf("one", "two", "three", "four", "five", "six")
    println(numbers.contains("four"))
    println("zero" in numbers)
    
    println(numbers.containsAll(listOf("four", "two")))
    println(numbers.containsAll(listOf("one", "zero")))
//sampleEnd
}

Кроме того, вы можете проверить, содержит ли коллекция какие-либо элементы, вызвав isEmpty() или isNotEmpty().

fun main() {
//sampleStart
    val numbers = listOf("one", "two", "three", "four", "five", "six")
    println(numbers.isEmpty())
    println(numbers.isNotEmpty())
    
    val empty = emptyList<String>()
    println(empty.isEmpty())
    println(empty.isNotEmpty())
//sampleEnd
}
Последнее изменение: 10 января 2023 года
Получение частей коллекции Упорядочение

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

Spec-Zone.ru

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