Рано или поздно вы можете найти следующее интересное, используя Группировка / группировка и фолд :
val map = list.groupingBy { it.first }
.fold(mutableSetOf<Int>()) { acc, e ->
acc.apply {
add(e.second)
}
}
Если вам не нравится, что MutableSet
выставлено(так как тип map
теперь будет Map<String, MutableSet<Int>>
), вы все равно можете явно установить тип map
, например val map : Map<String, Set<Int>> = ...
Или: если вам требуется такая функциональность чаще, выможет даже захотеть рассмотреть вашу собственную функцию расширения, аналогичную groupBy
:
inline fun <T, K, V> Iterable<T>.groupByDistinctValues(keySelector: (T) -> K, valueTransform: (T) -> V): Map<K, Set<V>> = groupByDistinctValuesTo(LinkedHashMap(), keySelector, valueTransform)
inline fun <T, K, V, M : MutableMap<in K, MutableSet<V>>> Iterable<T>.groupByDistinctValuesTo(destination: M, keySelector: (T) -> K, valueTransform: (T) -> V): M {
for (element in this) {
val key = keySelector(element)
val list = destination.getOrPut(key) { mutableSetOf() }
list.add(valueTransform(element))
}
return destination
}
, которую вы затем можете использовать, аналогично следующему:
val map = list.groupByDistinctValues({it.first}) { it.second }
// where map is then of type Map<String, Set<Int>>