Spec-Zone.ru › Kotlin 2

Группировка

Стандартная библиотека Kotlin предоставляет функции-расширения для группировки элементов коллекции. Базовая функция groupBy() принимает лямбда-функцию и возвращает Map. В этой карте каждый ключ — это результат лямбда-функции, а соответствующее значение — List элементов, для которых получен этот результат. Эту функцию можно использовать, например, чтобы сгруппировать список String по первой букве.

Вы также можете вызвать groupBy() со вторым лямбда-аргументом — функцией преобразования значений. В результирующей карте groupBy() с двумя лямбда-функциями ключи, полученные функцией keySelector, сопоставляются с результатами функции преобразования значений, а не с исходными элементами.

В этом примере показано, как использовать функцию groupBy() для группировки строк по первой букве, выполнять итерацию по группам в результирующем Map с помощью оператора for, а затем преобразовывать значения в верхний регистр с помощью функции valueTransform:

fun main() {
//sampleStart
    val numbers = listOf("one", "two", "three", "four", "five")

    // Groups the strings by their first letter using groupBy()
    val groupedByFirstLetter = numbers.groupBy { it.first().uppercase() }
    println(groupedByFirstLetter)
    // {O=[one], T=[two, three], F=[four, five]}

    // Iterates through each group and prints the key and its associated values
    for ((key, value) in groupedByFirstLetter) {
        println("Key: $key, Values: $value")
    }
    // Key: O, Values: [one]
    // Key: T, Values: [two, three]
    // Key: F, Values: [four, five]

    // Groups the strings by their first letter and transforms the values to uppercase
    val groupedAndTransformed = numbers.groupBy(keySelector = { it.first() }, valueTransform = { it.uppercase() })
    println(groupedAndTransformed)
    // {o=[ONE], t=[TWO, THREE], f=[FOUR, FIVE]}
//sampleEnd
}

Если вы хотите сгруппировать элементы, а затем выполнить операцию сразу над всеми группами, используйте функцию groupingBy(). Она возвращает экземпляр типа Grouping. Экземпляр Grouping позволяет выполнять операции над всеми группами отложенно: группы фактически создаются непосредственно перед выполнением операции.

В частности, Grouping поддерживает следующие операции:

  • eachCount() подсчитывает элементы в каждой группе.

  • fold() и reduce() выполняют операции свёртки и редукции для каждой группы как отдельной коллекции и возвращают результаты.

  • aggregate() последовательно применяет заданную операцию ко всем элементам каждой группы и возвращает результат. Это универсальный способ выполнения любых операций над Grouping. Используйте его для реализации пользовательских операций, когда свёртки или редукции недостаточно.

Вы можете использовать оператор for для результирующего Map, чтобы выполнить итерацию по группам, созданным функцией groupingBy(). Это позволяет получить доступ к каждому ключу и количеству элементов, связанных с этим ключом.

В следующем примере показано, как сгруппировать строки по первой букве с помощью функции groupingBy(), подсчитать элементы в каждой группе, а затем выполнить итерацию по каждой группе, чтобы вывести ключ и количество элементов:

fun main() {
//sampleStart
    val numbers = listOf("one", "two", "three", "four", "five")

    // Groups the strings by their first letter using groupingBy() and counts the elements in each group
    val grouped = numbers.groupingBy { it.first() }.eachCount()

    // Iterates through each group and prints the key and its associated values
    for ((key, count) in grouped) {
        println("Key: $key, Count: $count")
        // Key: o, Count: 1
        // Key: t, Count: 2
        // Key: f, Count: 2
    }
//sampleEnd
}
11 апреля 2025 г.
СортировкаОперации преобразования коллекций

© 2010–2026 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/collection-grouping.html

Spec-Zone.ru

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