如果我有all(axis=1)
并希望将其转换为immutableMap: Map<String, Int>
,那么最好的方法是什么?似乎没有任何方便的方式。
答案 0 :(得分:14)
更新: Kotlin 1.1 stdlib具有.toMutableMap()
功能。应该使用它而不是创建自己的。
-----------------------下面的旧答案--------------------- ---------
以下扩展功能的工作原理是将Map
复制到MutableMap
。
fun <K, V> Map<K, V>.toMutableMap(): MutableMap<K, V> {
return HashMap(this)
}
其他一些答案建议检查地图是否为MutableMap
然后再投射到它。应该不惜一切代价避免这种情况,因为这是一种不好的做法。在Kotlin中被Map
下调的事实意味着它预计不应该更改Map
,这样做会很危险。
答案 1 :(得分:9)
首先,正如之前关于Kotlin只读集合及其不变性的问题所述,它们实际上只是对可能的可变集合的实时视图。
Kotlin可以安全地检查这些类型的可变性,因为接口上有标记让Kotlin知道,例如:
// assuming some variable readOnlyMap of type Map<String, String>
val mutableMap: MutableMap<String, String> = if (readOnlyMap is MutableMap<*,*>) {
readOnlyMap as MutableMap
} else {
HashMap(readOnlyMap)
}
此is
检查在内部调用TypeIntrinsics.isMutableMap
,是了解它是否可投射的有效方法。如果您先进行此检查,则演员阵容中没有任何危险。你会注意到编译器非常高兴并且没有警告。如果您不打算修改被视为只读的同一地图,这可能会很危险,但表明您可以为影响进行转换。
如果你不想修改原始地图的机会,那么当然总是通过简单地用另一个地图HashMap(readOnlyMap)
调用HashMap的构造函数来制作副本。或者制作扩展功能:
fun <K, V> Map<K, V>.toMutableCopy() = HashMap(this)
并称之为:
val mutableMap = readOnlyMap.toMutableCopy()
现在你有了简单的方法。
另见: