Обзор операций над коллекциями
Стандартная библиотека 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