Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Kotlin中的不可变映射复制到可变映射_Kotlin - Fatal编程技术网

将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()
现在你有了简单的方法

另请参见:


我认为您应该显式地指定HashMap的泛型,否则您将得到一个具有平台键/值类型的映射。我建议不要使用
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()