首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用柯林斯Map.minus?

如何使用柯林斯Map.minus?
EN

Stack Overflow用户
提问于 2021-11-15 08:49:58
回答 1查看 129关注 0票数 2

柯林斯Map.minus是如何工作的?我原以为使用相同键的条目会被删除。

代码语言:javascript
复制
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)  
}
代码语言:javascript
复制
Output: 
{1=first, 2=second}
{1=first}
{1=first, 2=second}

Expected: 
{1=first, 2=second}
{1=first}
{2=second}

在Kotlin文档中:

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-11-15 08:55:54

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

代码语言:javascript
复制
operator fun <K, V> Map<out K, V>.minus(key: K): Map<K, V>

所以你应该做:

代码语言:javascript
复制
val diff = left.minus(1)
// or
val diff = left - 1

传入Map也会编译(但不会像您期望的那样),因为minus的接收器是一个具有协变(out)键类型的映射。编译器只是将您的left映射视为一个Map<Any, String>,并尝试从它中删除键mapOf(1 to "first")。当然,您的映射没有另一个映射作为键,所以什么都不删除。注意,以这种方式生成的diffMap<Any, String>类型的。

注意,文档中也写着“给定的键”,而不是“给定地图中的键”,所以您应该在这里给出一个键。

如果要删除多个键,可以给它一个键的IterableArraySequence (不是映射!)。这将调用minus的其他重载。

代码语言:javascript
复制
val diff = left - right.keys
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69971595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档