柯林斯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)
}Output:
{1=first, 2=second}
{1=first}
{1=first, 2=second}
Expected:
{1=first, 2=second}
{1=first}
{2=second}在Kotlin文档中:
返回一个包含原始映射的所有条目的映射,但带有给定键的条目除外。返回的映射保留原始映射的条目迭代顺序。
发布于 2021-11-15 08:55:54
minus的参数是K,而不是另一个映射:
operator fun <K, V> Map<out K, V>.minus(key: K): Map<K, V>所以你应该做:
val diff = left.minus(1)
// or
val diff = left - 1传入Map也会编译(但不会像您期望的那样),因为minus的接收器是一个具有协变(out)键类型的映射。编译器只是将您的left映射视为一个Map<Any, String>,并尝试从它中删除键mapOf(1 to "first")。当然,您的映射没有另一个映射作为键,所以什么都不删除。注意,以这种方式生成的diff是Map<Any, String>类型的。
注意,文档中也写着“给定的键”,而不是“给定地图中的键”,所以您应该在这里给出一个键。
如果要删除多个键,可以给它一个键的Iterable、Array或Sequence (不是映射!)。这将调用minus的其他重载。
val diff = left - right.keyshttps://stackoverflow.com/questions/69971595
复制相似问题