Получение отдельных элементов
Коллекции 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–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