首页 文章

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

提问于
浏览
12

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

2 回答

  • 9

    Update: Kotlin 1.1 stdlib具有 .toMutableMap() 功能 . 应该使用它而不是创建自己的 .

    -----------------------下面的旧答案------------------------ ------

    以下扩展功能通过将 Map 复制到 MutableMap 来工作 .

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

    其他一些答案建议检查 Map 是否为 MutableMap ,如果是,则转换为它 . 应该不惜一切代价避免这种情况,因为这是一种不好的做法 . 在Kotlin中它被低估到 Map 的事实意味着它不应该被改变,并且这样做是危险的 .

  • 14

    首先,正如之前关于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 并且是一种有效的方法来知道它是否可以转换 . 如果您先进行此检查,则演员阵容中没有任何危险 . 您'll note the compiler is perfectly happy and without warnings. This could be dangerous if you don' t打算修改被视为只读的同一 Map ,但表明您可以为效果进行转换 .

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

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

    并称之为:

    val mutableMap = readOnlyMap.toMutableCopy()
    

    现在你有了简单的方法 .

    See also:

相关问题