在Kotlin中将不可变的地图复制到可变的地图

如果我有一个immutableMap: Map<String, Int>并想将其转换为mutableMap: MutableMap<String, Int> ,那么最好的办法是什么? 似乎没有任何方便的方法。

首先,正如前面关于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是一个有效的方法来知道它是否可转换。 如果你先做这个检查,那么演员就没有危险了。 你会注意到编译器是完美的,没有警告。 如果您不打算修改被视为只读的相同地图,但是显示您可以施展影响,则这可能很危险。

如果你不想修改原始地图的机会,那么当然总是通过用另一个Map, HashMap(readOnlyMap)调用HashMap的构造函数来复制副本。 或者做一个扩展功能:

  fun <K, V> Map<K, V>.toMutableCopy() = HashMap(this) 

并称之为:

  val mutableMap = readOnlyMap.toMutableCopy() 

现在你有了简单的方法。

也可以看看:

  • Kotlin和不可变的收藏?
  • 如何把一个可变集合变成一个不可变的集合
  • Kotlin编辑列表
  • Kotlin实例化不可变列表
  • Klutter库不可变的包装器

下面的扩展函数通过将Map复制到MutableMap

 fun <K, V> Map<K, V>.toMutableMap(): MutableMap<K, V> { return HashMap(this) }