【问题标题】:Why is the sum of two mutable maps in kotlin a map为什么kotlin中两个可变映射的总和是一个映射
【发布时间】:2021-05-11 23:30:41
【问题描述】:

我有两个返回可变映射的函数

fun mumapone() = mutableMapOf<String, Any>("one" to 1)
fun mumaptwo() = mutableMapOf<String, Any>("two" to 1) + mumapone()

乐趣的类型mumaptwo() 变成Map 而不是MutableMap,为什么?似乎两个可变映射的总和总是一个Map,这是为什么呢?

我也可以使用变量,但输出是一样的

    fun fakeConfig() = xx +  yy
    val xx = mutableMapOf<String, Any>("one", 1)
    val yy = mutableMapOf<String, Any>("two", 1)

fakeConfig() 的类型仍然是 Map,改变它的唯一方法是强制转换它或

    (xx +  yy).toMutatleMap()

所以重复这个问题,为什么两个可变映射的总和变成一个映射而不是一个可变映射。

干杯,

es

【问题讨论】:

    标签: kotlin mutablemap


    【解决方案1】:

    一般+ 用于返回新数据结构的不可变操作符。

    您可以为 MutableMap 实现 + 运算符,但这不是一个好主意,因为为此已经存在 putAll() 函数:

    fun main() {
        val foo = mutableMapOf(1 to "one", 2 to "two")
        val bar = mapOf(3 to "three", 4 to "four")
        foo.putAll(bar)
        println(foo)
    }
    

    输出:

    {1=one, 2=two, 3=three, 4=four}
    

    最好使用+获取新的不可变映射,或者显式使用putAll()等可变操作。

    你可以这样写mumaptwo

    fun mumaptwo() = mumapone().putAll(mutableMapOf<String, Any>("two" to 1))
    

    【讨论】:

      【解决方案2】:

      可变映射提供特定于映射的写入操作。这些操作让您可以使用基于键的值访问来更改地图内容。

      MutableMap 只不过是一张具有写操作的地图

      在地图上定义写操作有一些规则:

      值可以更新。反过来,键永远不会改变:一旦你添加了一个条目,它的键是不变的。

      对于每个键,总是有一个与之关联的值。您可以添加和删除整个条目。

      添加操作

      要将新的键值对添加到可变映射,请使用put()

      要一次添加多个条目,请使用putAll()

      您还可以使用速记运算符形式向地图添加新条目。有两种方式:

      plusAssign (+=) 运算符。

      set()[] 运算符别名。

      【讨论】:

        【解决方案3】:

        当您将两个映射相加时,默认假定的接口是 Map,因为 MutableMap 是该接口的实现,它不能假定为 + 运算符。

        但是,如果您想避免强制转换或转换,您可以简单地创建第三个可变映射并将其中的其他两个映射相加。该地图将保留类型并且不需要强制转换。

        kotlin 文档中的更多信息:https://kotlinlang.org/docs/reference/map-operations.html#map-write-operations

        【讨论】:

          【解决方案4】:

          来自文档:

          通过从另一个映射替换或添加条目到该映射来创建一个新的只读映射。

          operator fun <K, V> Map<out K, V>.plus(
              map: Map<out K, V>
          ): Map<K, V>
          

          【讨论】:

            【解决方案5】:

            加号操作只在Map接口中定义,其结果是一个不可变的map。

            MutableMap 实现不会覆盖此操作,因此,当您使用可变映射调用它时,您实际上是在调用 Map 操作而不是 MutableMap 操作。 如您所见

            https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-mutable-map/

            【讨论】:

              猜你喜欢
              • 2021-10-28
              • 1970-01-01
              • 2016-05-13
              • 1970-01-01
              • 2018-08-23
              • 2012-06-24
              • 2012-07-17
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多