Обзор операций над коллекциями
Стандартная библиотека Kotlin предоставляет широкий набор функций для выполнения операций над коллекциями. Это включает простые операции, такие как получение или добавление элементов, а также более сложные, включая поиск, сортировку, фильтрацию, преобразования и так далее.
Расширения и члены функций
Операции над коллекциями объявляются в стандартной библиотеке двумя способами: членами функций интерфейсов коллекций и расширяющими функциями.
Функции-члены определяют операции, которые необходимы для типа коллекции. Например, Collection содержит функцию isEmpty() для проверки пустоты; List содержит get() для доступа к элементам по индексу и так далее.
При создании собственных реализаций интерфейсов коллекций необходимо реализовать их функции-члены. Чтобы упростить создание новых реализаций, используйте скелетные реализации интерфейсов коллекций из стандартной библиотеки: AbstractCollection, AbstractList, AbstractSet, AbstractMap и их изменяемые аналоги.
Другие операции над коллекциями объявляются как расширяющие функции. К ним относятся функции фильтрации, преобразования, упорядочивания и другие функции обработки коллекций.
Общие операции
Общие операции доступны как для постоянных, так и для изменяемых коллекций. Общие операции делятся на эти группы:
Операции, описанные на этих страницах, возвращают свои результаты, не изменяя исходную коллекцию. Например, операция фильтрации создаёт новую коллекцию, содержащую все элементы, соответствующие условию фильтрации. Результаты таких операций следует либо сохранять в переменных, либо использовать каким-либо другим способом, например, передавать в другие функции.
fun main() {
//sampleStart
val numbers = listOf("one", "two", "three", "four")
numbers.filter { it.length > 3 } // nothing happens with `numbers`, result is lost
println("numbers are still $numbers")
val longerThan3 = numbers.filter { it.length > 3 } // result is stored in `longerThan3`
println("numbers longer than 3 chars are $longerThan3")
//sampleEnd
}
Для определённых операций над коллекциями есть возможность указать объект назначения. Назначение — это изменяемая коллекция, в которую функция добавляет свои результирующие элементы вместо возврата их в новом объекте. Для выполнения операций с назначениями существуют отдельные функции с суффиксом To в их названиях, например, filterTo() вместо filter() или associateTo() вместо associate(). Эти функции принимают коллекцию назначения в качестве дополнительного параметра.
fun main() {
//sampleStart
val numbers = listOf("one", "two", "three", "four")
val filterResults = mutableListOf<String>() //destination object
numbers.filterTo(filterResults) { it.length > 3 }
numbers.filterIndexedTo(filterResults) { index, _ -> index == 0 }
println(filterResults) // contains results of both operations
//sampleEnd
}
Для удобства эти функции возвращают коллекцию назначения, поэтому вы можете создать её прямо в соответствующем аргументе вызова функции:
fun main() {
val numbers = listOf("one", "two", "three", "four")
//sampleStart
// filter numbers right into a new hash set,
// thus eliminating duplicates in the result
val result = numbers.mapTo(HashSet()) { it.length }
println("distinct item lengths are $result")
//sampleEnd
}
Функции с назначением доступны для фильтрации, сопоставления, группировки, сглаживания и других операций. Полный список операций назначения см. в справочнике по коллекциям Kotlin.
Операции записи
Для изменяемых коллекций также существуют операции записи, которые изменяют состояние коллекции. К таким операциям относятся добавление, удаление и обновление элементов. Операции записи перечислены в разделах Операции записи и соответствующих разделах Операций над списками и Операций над картами.
Для некоторых операций существуют пары функций для выполнения одной и той же операции: одна применяет операцию на месте, изменяя её состояние, а другая возвращает результат как отдельную коллекцию. Например, sort() сортирует изменяемую коллекцию на месте, поэтому её состояние меняется; sorted() создаёт новую коллекцию, содержащую те же элементы в отсортированном порядке.
fun main() {
//sampleStart
val numbers = mutableListOf("one", "two", "three", "four")
val sortedNumbers = numbers.sorted()
println(numbers == sortedNumbers) // false
numbers.sort()
println(numbers == sortedNumbers) // true
//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-operations.html