如何修改Kotlin的地图?

我正在试图扭转科特林的地图。 到目前为止,我已经想出了:

mapOf("foo" to 42) .toList() .map { (k, v) -> v to k } .toMap() 

有没有更好的方式做到这一点,而不使用中间人(中间名)?

由于MapEntry组成,并且不是可Iterable 。 但是可以使用Map#条目 ,它将映射到Map#entrySet以创建Set<Entry>的备份视图,例如:

 val reversed = map.entries.associateBy({ it.value }) { it.key } 

或者使用Iterable#关联 ,但它会创建额外的Pair

 val reversed = map.entries.associate{(k,v)-> v to k} 

或者使用Map#forEach代替。 例如:

 val reversed = mutableMapOf<Int, String>().also { // v-- use `forEach` here map.forEach { (k, v) -> it.put(v, k) } }.toMap() // ^--- you can add `toMap()` to create an immutable Map. 

这是一个简单的扩展函数,它可以反转地图 – 不会产生不需要的垃圾(如对,中间数据结构和不必要的关闭)

 fun <K, V> Map<K, V>.reversed() = HashMap<V, K>().also { newMap -> entries.forEach { newMap.put(it.value, it.key) } } 

注意apply是内联的,并且entries.forEach也是内联的( Map::forEach