将不可变映射文件复制到Kotlin中的可变映射文件中
问题描述:
如果我有一个immutableMap: Map<String, Int>
并想将其转换为mutableMap: MutableMap<String, Int>
,那么最好的方法是什么?似乎没有任何方便的方法。将不可变映射文件复制到Kotlin中的可变映射文件中
答
以下扩展功能的工作原理是将Map
复制到MutableMap
。
fun <K, V> Map<K, V>.toMutableMap(): MutableMap<K, V> {
return HashMap(this)
}
答
首先,在覆盖前面的问题有关科特林只读集合及其不变性,他们是真正的只读生活意见可能可变集合的。
科特林可以安全地检查可变性的类型,这些因为有上,让科特林知道接口标记,例如:
// 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()
现在你有你的简单方法。
参见:
我认为你应该明确指定HashMap的泛型,否则你最终会得到一个带有平台键/值类型的映射。 –
我建议不要'MutableMap'检查,因为它可以返回真正的Java集合,这些集合实际上并不可变。例如,尝试'Collections.unmodifiableMap(mutableMapOf(“a”到“b”))是MutableMap '。 –
这看起来对我来说是最好的答案。你可能会添加一个例子,它不直接使用HashMap(我相信'mutableMapOf'实际上使用'LinkedHashMap')。例如:'val mutableMap = map.entries.associateTo(mutableMapOf()){entry - > entry.toPair()}'。 – mfulton26