Spec-Zone.ru › Kotlin 2

Извлечение отдельных элементов

Коллекции 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(). Она объединяет два действия:

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

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

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
}
11 сентября 2023 г.
Извлечение частей коллекцииОбзор операций с коллекциями

© 2010–2026 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