Kotlin Map中plus()和put()方法之间的区别是什么?

esu*_*esu 2 kotlin

Kotlin Map中plus()和put()方法之间的区别是什么?

我已经创建了地图,并使用plus()方法添加了键值对,但是在打印地图时,找不到添加的值。然后我转到了put()。plus()方法的行为是什么?

yol*_*ole 6

文档所述,该plus方法(通常以其运算符形式使用+)返回一个新映射,该映射包含原始映射中的元素以及作为参数传递给它的键/值对。它不会修改在其上调用的地图。

向Kotlin地图添加值的惯用方式不是使用该put方法,而是使用方括号:

map[key] = value
Run Code Online (Sandbox Code Playgroud)


小智 6

正则Map(不可变)只能使用plus函数(也可以使用 + 运算符调用)进行修改。

plus运算符使用值对,并且本质上不会修改原始映射;它返回带有新条目的新地图。

// mapA and mapB are different maps
val mapA = mapOf("a" to 1, "b" to 2)
val mapB = mapA + ("c" to 3)
Run Code Online (Sandbox Code Playgroud)

使用 时MutableMap,除了plus(仍将返回新映射)之外,还有几个选项可以更改映射的内容:putset(即 [] 运算符)和plusAssign(即 += 运算符)。

set作为函数调用,和之间的区别put在于put返回键的前一个值(或 null),set而不返回任何内容。另外,使用括号语法时,不能将其用作函数的表达式体。当创建包装类来访问映射内的数据时,它特别有用:

class SomeWrapper(private val backingMap: MutableMap<String, String?>) {

    var someIntValue: Int?
        get() = backingMap["someInt"]?.toIntOrNull() 
        set(value) = backingMap.set("someInt", value.toString())

        // this is invalid because assignments are not expressions
        // set(value) = backingMap["someInt"] = value

        // this is also invalid because put would return String? instead of Unit
        // set(value) = backingMap.put("someInt", value)

}
Run Code Online (Sandbox Code Playgroud)

(当然,在上面的示例中,您可以将 setter 更改为使用块语法而不是表达式语法,这是一个品味问题)

的语法plusAssign与 类似plus,但它会更改原始映射:

val map = mutableMapOf("a" to 1, "b" to 2)
map += ("c" to 3)
Run Code Online (Sandbox Code Playgroud)