Группировка
Стандартная библиотека 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
}
© 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