Spec-Zone.ru › Kotlin 1.7

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

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

© 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

Spec-Zone.ru

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