如何修改Kotlin的地图?
我正在试图扭转科特林的地图。 到目前为止,我已经想出了:
mapOf("foo" to 42) .toList() .map { (k, v) -> v to k } .toMap()
有没有更好的方式做到这一点,而不使用中间人(中间名)?
由于Map
由Entry
组成,并且不是可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
)