Функция groupBy

Функция groupBy группирует элементы коллекции по ключу, который вычисляется с помощью переданной ключевой функции. Результатом является словарь Map, где ключи - это результаты ключевой функции, а значения - списки элементов, соответствующих каждому ключу. Работает с массивами Array, списками List, множествами Set и другими типами коллекций.

Синтаксис

kotlininline fun <T, K> Array<out T>.groupBy(
  keySelector: (T) -> K
): Map<K, List<T>>
kotlininline fun <T, K> Iterable<T>.groupBy(
  keySelector: (T) -> K
): Map<K, List<T>>
kotlininline fun <K> CharSequence.groupBy(
  keySelector: (Char) -> K
): Map<K, List<Char>>

Пример

Сгруппируем числа по их четности:

kotlinval numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
val res = numbers.groupBy { it % 2 == 0 }
println(res)

Результат выполнения кода:

kotlinMap<Boolean, List<Int>> {false=[1, 3, 5, 7, 9], true=[2, 4, 6, 8, 10]}

Пример

Сгруппируем символы строки по их регистру:

kotlinval text = "HelloWorld"
val res = text.groupBy { it.isUpperCase() }
println(res)

Результат выполнения кода:

kotlinMap<Boolean, List<Char>> {false=[e, l, l, o, o, r, l, d], true=[H, W]}

Пример

Сгруппируем элементы массива по их длине:

kotlinval words = arrayOf("apple", "banana", "cherry", "date", "fig")
val res = words.groupBy { it.length }
println(res)

Результат выполнения кода:

kotlinMap<Int, List<String>> {5=[apple], 6=[banana, cherry], 4=[date], 3=[fig]}

Синтаксис с преобразованием значений

kotlininline fun <T, K, V> Array<out T>.groupBy(
  keySelector: (T) -> K,
  valueTransform: (T) -> V
): Map<K, List<V>>
kotlininline fun <T, K, V> Iterable<T>.groupBy(
  keySelector: (T) -> K,
  valueTransform: (T) -> V
): Map<K, List<V>>

Пример

Сгруппируем слова по первой букве, преобразовав значения в верхний регистр:

kotlinval words = listOf("apple", "banana", "cherry", "date", "fig")
val res = words.groupBy(
  keySelector = { it.first() },
  valueTransform = { it.uppercase() }
)
println(res)

Результат выполнения кода:

kotlinMap<Char, List<String>> {a=[APPLE], b=[BANANA], c=[CHERRY], d=[DATE], f=[FIG]}

Синтаксис с целевой Map

kotlininline fun <T, K, V, M : MutableMap<in K, MutableList<V>>> Array<out T>.groupByTo(
  destination: M,
  keySelector: (T) -> K,
  valueTransform: (T) -> V
): M
kotlininline fun <T, K, M : MutableMap<in K, MutableList<T>>> Array<out T>.groupByTo(
  destination: M,
  keySelector: (T) -> K
): M

Пример

Группировка с использованием существующей Map:

kotlinval 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)

Результат выполнения кода:

kotlinMap<String, MutableList<Int>> {odd=[1, 3, 5], even=[2, 4, 6]}

Смотрите также

  • функцию associateBy,
    которая создает Map с ключами из результатов ключевой функции
  • функцию partition,
    которая разделяет коллекцию на две части по условию
  • функцию filter,
    которая фильтрует элементы коллекции по условию