将Kotlin中的不可变映射复制到可变映射
如果我有一个将Kotlin中的不可变映射复制到可变映射,kotlin,Kotlin,如果我有一个immutableMap:Map并想将其转换为mutableMap:mutableMap,那么最好的方法是什么?似乎没有任何方便的方法。更新:Kotlin 1.1 stdlib有一个.toMutableMap()函数。应该使用它,而不是创建自己的 -----------------------下面是老答案------------------------------ 以下扩展功能通过将映射复制到可变映射来工作 fun <K, V> Map<K, V>.toMut
immutableMap:Map
并想将其转换为mutableMap:mutableMap
,那么最好的方法是什么?似乎没有任何方便的方法。更新:Kotlin 1.1 stdlib有一个.toMutableMap()
函数。应该使用它,而不是创建自己的
-----------------------下面是老答案------------------------------
以下扩展功能通过将映射
复制到可变映射
来工作
fun <K, V> Map<K, V>.toMutableMap(): MutableMap<K, V> {
return HashMap(this)
}
funmap.toMutableMap():可变映射{
返回HashMap(this)
}
其他一些答案建议检查映射是否为
MutableMap
,然后对其进行强制转换。这应该不惜一切代价避免,因为这是一种不好的做法。在Kotlin中将其降级为Map
,这一事实意味着不应更改此Map
,这样做是危险的。首先,正如前面关于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)
}
并称之为:
val mutableMap = readOnlyMap.toMutableCopy()
现在你有了简单的方法
另请参见:
is MutableMap
检查,因为它可以为实际上不可变的Java集合返回true
。例如,尝试Collections.unmodifiableMap(mutableMapOf(“a”到“b”))是MutableMap
。这看起来是最好的答案。您可以添加一个示例,它不直接使用HashMap
(我相信mutableMapOf
实际上使用LinkedHashMap
)。e、 g.:val mutableMap=map.entries.associateTo(mutableMapOf()){entry->entry.toPair()}
。在某些情况下强制转换映射,在其他情况下复制映射可能会导致一些不可预知的行为。我不确定你的回答中是否应该鼓励这样做。这在很大程度上取决于未知的完整用例,所以我给出了各种选择。买家要小心。
val mutableMap = readOnlyMap.toMutableCopy()