Функция groupBy
Функция groupBy группирует элементы коллекции
по ключу, который вычисляется с помощью переданной
ключевой функции. Результатом является словарь Map,
где ключи - это результаты ключевой функции,
а значения - списки элементов, соответствующих каждому ключу.
Работает с массивами Array, списками List,
множествами Set и другими типами коллекций.
Синтаксис
inline fun <T, K> Array<out T>.groupBy(
keySelector: (T) -> K
): Map<K, List<T>>
inline fun <T, K> Iterable<T>.groupBy(
keySelector: (T) -> K
): Map<K, List<T>>
inline fun <K> CharSequence.groupBy(
keySelector: (Char) -> K
): Map<K, List<Char>>
Пример
Сгруппируем числа по их четности:
val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val res = numbers.groupBy { it % 2 == 0 }
println(res)
Результат выполнения кода:
Map<Boolean, List<Int>> {false=[1, 3, 5, 7, 9], true=[2, 4, 6, 8, 10]}
Пример
Сгруппируем символы строки по их регистру:
val text = "HelloWorld"
val res = text.groupBy { it.isUpperCase() }
println(res)
Результат выполнения кода:
Map<Boolean, List<Char>> {false=[e, l, l, o, o, r, l, d], true=[H, W]}
Пример
Сгруппируем элементы массива по их длине:
val words = arrayOf("apple", "banana", "cherry", "date", "fig")
val res = words.groupBy { it.length }
println(res)
Результат выполнения кода:
Map<Int, List<String>> {5=[apple], 6=[banana, cherry], 4=[date], 3=[fig]}
Синтаксис с преобразованием значений
inline fun <T, K, V> Array<out T>.groupBy(
keySelector: (T) -> K,
valueTransform: (T) -> V
): Map<K, List<V>>
inline fun <T, K, V> Iterable<T>.groupBy(
keySelector: (T) -> K,
valueTransform: (T) -> V
): Map<K, List<V>>
Пример
Сгруппируем слова по первой букве, преобразовав значения в верхний регистр:
val words = listOf("apple", "banana", "cherry", "date", "fig")
val res = words.groupBy(
keySelector = { it.first() },
valueTransform = { it.uppercase() }
)
println(res)
Результат выполнения кода:
Map<Char, List<String>> {a=[APPLE], b=[BANANA], c=[CHERRY], d=[DATE], f=[FIG]}
Синтаксис с целевой Map
inline fun <T, K, V, M : MutableMap<in K, MutableList<V>>> Array<out T>.groupByTo(
destination: M,
keySelector: (T) -> K,
valueTransform: (T) -> V
): M
inline fun <T, K, M : MutableMap<in K, MutableList<T>>> Array<out T>.groupByTo(
destination: M,
keySelector: (T) -> K
): M
Пример
Группировка с использованием существующей Map:
val numbers = listOf(1, 2, 3, 4, 5, 6)
val destinationMap = mutableMapOf<String, MutableList<Int>>()
val res = numbers.groupByTo(destinationMap) {
if (it % 2 == 0) "even" else "odd"
}
println(res)
Результат выполнения кода:
Map<String, MutableList<Int>> {odd=[1, 3, 5], even=[2, 4, 6]}
Смотрите также
-
функцию
associateBy,
которая создает Map с ключами из результатов ключевой функции -
функцию
partition,
которая разделяет коллекцию на две части по условию -
функцию
filter,
которая фильтрует элементы коллекции по условию