You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何移除Kotlin可变Map中所有指向指定值的键值对

移除可变Map中所有指向"A"的键值对的优雅实现

先明确你的场景:你有这样一个可变Map:

1 -> A 45 -> A 88 -> R 98 -> X 105 -> A

你想要移除所有值为"A"的键值对,试过两种实现但觉得不够理想,那咱们来聊聊最优解。

先说说你那两种实现的问题:

  • Version 1:myMap.forEach { key, value -> if (value == "A") myMap.remove(key) }
    这种写法会直接抛出ConcurrentModificationException,因为在遍历Map的过程中直接修改它的结构(移除元素)是不被允许的,forEach遍历的是原Map的视图,修改会触发并发修改检查。

  • Version 2:

    with (myMap) {
        val filtered = filterValues { it != "A" }
        clear()
        putAll(filtered)
    }
    

    这种写法是可行的,但确实有点繁琐——需要先创建一个过滤后的新Map,再清空原Map,最后把新Map的内容塞回去,多了好几个步骤,效率也不如原地修改高。


正确且最优雅的实现方式

Kotlin为可变集合提供了专门的removeIf方法,对于MutableMap来说,你可以直接操作它的entries集合(因为entries是一个MutableCollection),一行代码就能搞定:

myMap.entries.removeIf { it.value == "A" }

这个方法的优势:

  • 原地修改:直接在原Map上移除符合条件的键值对,不需要创建新的Map对象,内存效率更高。
  • 安全可靠:内部是通过迭代器来实现的,不会触发并发修改异常,完全符合集合遍历修改的规范。
  • 简洁直观:一行代码就表达了“移除所有值为'A'的条目”的意图,可读性拉满。

如果你的场景允许使用不可变Map的话,其实直接用filterValues也很简洁:

val newMap = myMap.filterValues { it != "A" }

但既然你用的是可变Map,想要修改原对象,那entries.removeIf就是最优解啦。

内容的提问来源于stack exchange,提问作者Pitel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:57:01