Получение отдельных элементов
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
}
Случайный элемент
Если вам нужно получить произвольный элемент коллекции, вызовите функцию 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–2020 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/reference/collection-elements.html