Получение отдельных элементов
Коллекции 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
}
© 2010–2022 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/collection-elements.html