2

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

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

fun 的类型mumaptwo()变成 aMap而不是 a MutableMap,为什么?似乎两个可变映射的总和总是 a 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

4

5 回答 5

3

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

您可以+为 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))
于 2021-02-08T11:18:17.750 回答
2

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

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

有一些规则定义了 map 上的写操作:

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

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

添加操作

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

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

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

加号(+=)运算符。

[]运算符别名set()

于 2021-02-08T12:05:08.463 回答
1

从文档:

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

operator fun <K, V> Map<out K, V>.plus(
    map: Map<out K, V>
): Map<K, V>
于 2021-02-08T11:09:38.013 回答
1

当你对这两个映射求和时,默认假定的接口是 Map,因为 MutableMap 是接口的实现,它不能被假定为+操作员。

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

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

于 2021-02-08T11:06:15.660 回答
0

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

MutableMap 实现不会覆盖此操作,因此,当您使用可变映射调用它时,您实际上是在调用 Map 操作而不是 MutableMap 操作。正如你在这里看到的

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

于 2021-02-08T11:09:18.720 回答