Kotlins Map.minus 应该如何使用?

Fab*_*ian 5 kotlin

Kotlins Map.minus 是如何工作的?我本以为具有相同密钥的条目会被删除。

fun main() 
{
    val left = mapOf(1 to "first", 2 to "second")
    val right = mapOf(1 to "first")
    val diff = left.minus(right)
    
    println(left)
    println(right)
    println(diff)  
}
Run Code Online (Sandbox Code Playgroud)
Output: 
{1=first, 2=second}
{1=first}
{1=first, 2=second}

Expected: 
{1=first, 2=second}
{1=first}
{2=second}
Run Code Online (Sandbox Code Playgroud)

来自 Kotlin 文档:

返回一个包含原始映射中除具有给定键的条目之外的所有条目的映射。返回的映射保留原始映射的条目迭代顺序。

Swe*_*per 7

的参数minusK,而不是另一个映射:

operator fun <K, V> Map<out K, V>.minus(key: K): Map<K, V>
Run Code Online (Sandbox Code Playgroud)

所以你应该这样做:

val diff = left.minus(1)
// or
val diff = left - 1
Run Code Online (Sandbox Code Playgroud)

传入 aMap也会编译(但不会执行您期望的操作),因为minus的接收者是具有协变 ( ) 键类型的映射out。编译器只是将您的left映射视为,并尝试从中Map<Any, String>删除键。mapOf(1 to "first")当然,您的地图没有其他地图作为键,因此不会删除任何内容。请注意,以diff这种方式生成的类型为Map<Any, String>

请注意,文档还说“给定的密钥”,而不是“给定映射中的密钥”,因此您应该在此处给出一个密钥。

如果你想删除多个键,你可以给它一个、 、 或 键IterableArray不是Sequence映射!)。这将调用 的其他重载。minus

val diff = left - right.keys
Run Code Online (Sandbox Code Playgroud)