Обзор операций с коллекциями
Стандартная библиотека 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–2022 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/collection-operations.html