Группирование
Стандартная библиотека Kotlin предоставляет расширяющие функции для группирования элементов коллекции. Основная функция groupBy() принимает лямбда-функцию и возвращает Map. В этом отображении каждый ключ — результат выполнения лямбда-функции, а соответствующее значение — List элементов, для которых возвращён этот результат. Эту функцию можно использовать, например, для группирования списка String по их первой букве.
Вы также можете вызвать groupBy() со вторым лямбда-аргументом — функцией преобразования значения. В результирующем отображении groupBy() с двумя лямбда-функциями ключи, сгенерированные функцией keySelector, сопоставляются с результатами функции преобразования значения, а не с исходными элементами.
fun main() {
//sampleStart
val numbers = listOf("one", "two", "three", "four", "five")
println(numbers.groupBy { it.first().toUpperCase() })
println(numbers.groupBy(keySelector = { it.first() }, valueTransform = { it.toUpperCase() }))
//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–2020 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/reference/collection-grouping.html