Kotlin - from a list of Maps, to a map grouped by key
我有一个
因此,如果我有一个仅包含2个元素的初始列表:
清单
1 2 3 4 5 6 | 1. branch1 -> Pair(key1,value1) branch2 -> Pair(key2,value2) 2. branch1 -> Pair(key1a,value1a) |
我要结束于:
地图
1 2 3 4 5 | branch1 -> Pair(key1,value1) Pair(key1a,value1a) branch2 -> Pair(key2,value2) |
因此是一种groupBy,它使用了最初嵌套的映射中所有键的值。
我尝试过
1 | list.groupBy{it-> it.keys.first()} |
但显然不起作用,因为它仅使用第一个密钥。 我想要相同的东西,但是将所有键用作单独的值。
在Kotlin中,最惯用的方式是什么? 我有一个看起来很丑的Java工作版本,但是我很确定Kotlin有一个很好的方法来做..只是到目前为止我还没有找到它!
任何的想法 ?
谢谢
1 2 3 4 5 | val list: List<Map<Branch, Pair<String, Any>>> = listOf() val map = list .flatMap { it.entries } .groupBy { it.key } .mapValues { entry -> entry.value.map { it.value } } |
下列:
1 2 3 4 5 | val result = listOfMaps.asSequence() .flatMap { it.asSequence() }.groupBy({ it.key }, { it.value }) |
将为您提供类型为
我设法写了这个。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | data class Branch(val name: String) data class Key(val name: String) data class Value(val name: String) val sharedBranch = Branch("1") val listOfMaps: List<Map<Branch, Pair<Key, Value>>> = listOf( mapOf(sharedBranch to Pair(Key("1"), Value("1")), Branch("2") to Pair(Key("2"), Value("2"))), mapOf(sharedBranch to Pair(Key("1a"), Value("1a"))) ) val mapValues: Map<Branch, List<Pair<Key, Value>>> = listOfMaps.asSequence() .flatMap { map -> map.entries.asSequence() } .groupBy(Map.Entry<Branch, Pair<Key, Value>>::key) .mapValues { it.value.map(Map.Entry<Branch, Pair<Key, Value>>::value) } println(mapValues) |
是否可以满足您的需求?
将其提取到扩展功能
1 2 | private fun <K, V> List<Map<K, V>>.group(): Map<K, List<V>> = asSequence().flatMap { it.asSequence() }.groupBy({ it.key }, { it.value }) |
像这样使用它:
1 2 | val list = yourListOfMaps val grouped = list.group() |