Обзор операций с коллекциями
Стандартная библиотека Kotlin предлагает широкий спектр функций для выполнения операций над коллекциями. Это включает простые операции, такие как получение или добавление элементов, а также более сложные, включая поиск, сортировку, фильтрацию, преобразования и т.д.
Расширения и члены функций
Операции с коллекциями объявляются в стандартной библиотеке двумя способами: члены функций интерфейсов коллекций и расширяющие функции.
Функции-члены определяют операции, которые являются существенными для типа коллекции. Например, Collection содержит функцию isEmpty() для проверки ее пустоты; List содержит функцию get() для доступа к элементам по индексу и так далее.
При создании собственных реализаций интерфейсов коллекций, необходимо реализовать их функции-члены. Для упрощения создания новых реализаций используйте скелетные реализации интерфейсов коллекций из стандартной библиотеки: AbstractCollection, AbstractList, AbstractSet, AbstractMap и их изменяемые аналоги.
Другие операции с коллекциями объявляются как расширяющие функции. Это функции для фильтрации, преобразования, упорядочивания и других функций обработки коллекций.
Общие операции
Общие операции доступны как для чтени-только, так и для изменяемых коллекций. Общие операции разделяются на эти группы:
- Преобразования
- Фильтрация
- Операторы
plusиminus - Группировка
- Получение частей коллекции
- Получение отдельных элементов
- Упорядочение
- Агрегирующие операции
Описанные на этих страницах операции возвращают свои результаты без изменения исходной коллекции. Например, операция фильтрации создаёт новую коллекцию, содержащую все элементы, соответствующие фильтрующему предикату. Результаты таких операций следует либо сохранить в переменных, либо использовать каким-либо другим способом, например, передать в другие функции.
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–2020 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/reference/collection-operations.html