groupBy

inline suspend fun <T, K> Flow<T>.groupBy(crossinline keySelector: suspend (T) -> K): Map<K, List<T>>(source)

Groups elements of the original Flow by the key returned by the given keySelector function applied to each element and returns a map where each group key is associated with the list of corresponding elements.

The entry iteration order of the resulting Map is the order in which the keys were first encountered when applying keySelector to the Flow elements.

The operation is terminal.

val words = flowOf("a", "abc", "ab", "def", "abcd")
val byLength = words.groupBy { it.length }

println(byLength.keys) // [1, 3, 2, 4]
println(byLength.values) // [[a], [abc, def], [ab], [abcd]]

val mutableByLength: MutableMap<Int, MutableList<String>> = words.groupByTo(mutableMapOf()) { it.length }
// same content as in byLength map, but the map is mutable
println("mutableByLength == byLength is ${mutableByLength == byLength}") // true

inline suspend fun <T, K, V> Flow<T>.groupBy(crossinline keySelector: suspend (T) -> K, crossinline valueTransform: suspend (T) -> V): Map<K, List<V>>(source)

Groups values returned by the valueTransform function applied to each element of the original Flow by the key returned by the given keySelector function applied to the element and returns a map where each group key is associated with the list of corresponding values.

The entry iteration order of the resulting Map is the order in which the keys were first encountered when applying keySelector to the Flow elements.

The operation is terminal.

val nameToTeam = flowOf("Alice" to "Marketing", "Bob" to "Sales", "Carol" to "Marketing")
val namesByTeam = nameToTeam.groupBy({ it.second }, { it.first })
println(namesByTeam) // {Marketing=[Alice, Carol], Sales=[Bob]}

val mutableNamesByTeam = nameToTeam.groupByTo(HashMap(), { it.second }, { it.first })
// same content as in namesByTeam map, but the map is mutable
println("mutableNamesByTeam == namesByTeam is ${mutableNamesByTeam == namesByTeam}") // true