在Kotlin中将不可变映射复制到可变映射

时间:2016-07-26 15:38:42

标签: kotlin

如果我有all(axis=1)并希望将其转换为immutableMap: Map<String, Int>,那么最好的方法是什么?似乎没有任何方便的方式。

2 个答案:

答案 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()

现在你有了简单的方法。

另见: