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