Группировка
Стандартная библиотека Kotlin предоставляет функции расширения для группировки элементов коллекции. Основная функция groupBy() принимает лямбда-функцию и возвращает Map. В этом отображении каждый ключ — результат лямбда-функции, а соответствующее значение — List элементов, для которых возвращён этот результат. Эту функцию можно использовать, например, для группировки списка String по их первой букве.
Вы также можете вызвать groupBy() со вторым аргументом — функцией преобразования значений. В результате отображения groupBy() с двумя лямбдами ключи, сгенерированные функцией keySelector , сопоставляются с результатами функции преобразования значений вместо исходных элементов.
fun main() {
//sampleStart
val numbers = listOf("one", "two", "three", "four", "five")
println(numbers.groupBy { it.first().uppercase() })
println(numbers.groupBy(keySelector = { it.first() }, valueTransform = { it.uppercase() }))
//sampleEnd
}
Если вы хотите сгруппировать элементы и затем применить операцию ко всем группам одновременно, используйте функцию groupingBy(). Она возвращает экземпляр типа Grouping. Экземпляр Grouping позволяет применять операции ко всем группам ленивым способом: группы фактически строятся непосредственно перед выполнением операции.
Именно, Grouping поддерживает следующие операции:
eachCount()подсчитывает элементы в каждой группе.fold()иreduce()выполняют операции fold и reduce над каждой группой как отдельной коллекцией и возвращают результаты.aggregate()последовательно применяет заданную операцию ко всем элементам в каждой группе и возвращает результат. Это общий способ выполнения любых операций надGrouping. Используйте его для реализации пользовательских операций, когда fold или reduce недостаточны.
fun main() {
//sampleStart
val numbers = listOf("one", "two", "three", "four", "five", "six")
println(numbers.groupingBy { it.first() }.eachCount())
//sampleEnd
}
© 2010–2022 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/collection-grouping.html