TL; DR: Требуется преобразовать значения, сгруппированные в списке, поэтому:
emailMesssages.groupBy(
{ MessageDestination(it.second) },
{ it.first }
)
Длинная версия:
Итак, вы начинаете с: emailMesssages: List<Pair<MessageSender, String>>
и хотите преобразовать его в тип Map<MessageDestination, List<MessageSender>>
Вы пытаетесь добиться этого с помощью emailMesssages.groupBy { MessageDestination(it.second) }
.Что groupBy
группирует элементы из списка по указанному вами ключу.Важно то, что он объединяет все элементы (в данном случае все Pair
с) для одного ключа в список .
Так что если у вас есть (пример из официальных документов ):
val words = listOf("a", "abc", "ab", "def", "bc")
val byLength = words.groupBy { it.length }
тогда byLength равно:
1 -> listOf("a")
2 -> listOf("ab", "bc")
3 -> listOf("abc", "def")
Это объясняет, почему у вас есть тип Map<MessageDestination, List<Pair<MessageSender, String>>>
вместо Map<MessageDestination, List<MessageSender>>
.
То, что вы хотите не нужно группировать элементы из списка , вы хотите группировать преобразованные значения из элементов списка .
По сути, вам нужен еще один вариант 'groupBy' с keySelector AND valueTransform:
inline fun <T, K, V> Array<out T>.groupBy(
keySelector: (T) -> K,
valueTransform: (T) -> V
): Map<K, List<V>> (source)`
в вашем случае это будет выглядеть так:
emailMesssages.groupBy(
{ MessageDestination(it.second) },
{ it.first }
)