Spec-Zone.ru › Kotlin 1.8

Обзор операций над коллекциями

Стандартная библиотека 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
}
Последнее изменение: 10 января 2023 года
Последовательности Операции преобразования коллекций

© 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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API