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

如何在Kotlin中保留Map中指定键集合的条目?

实现仅保留指定键的Map子集合

Kotlin标准库中并没有直接提供Map.retainAll(Collection<K>)这类开箱即用的方法,但你可以通过扩展函数实现完全符合预期的直观写法,同时也能从现有标准库方法里选择最贴近需求的方案。

先分析你试过的几种方法的特点

  • myList.associateWith { myMap[it] }:会将myList中所有元素都作为新Map的键,哪怕原myMap中没有对应值(此时值为null),如果你的场景不允许键对应null,这个写法会不符合预期。
  • myMap.filterKeys { it in myList }:这是现有标准库方法里语义最直观的,直接表达“过滤出键存在于myList中的条目”,可读性已经很强,推荐优先使用。
  • myMap - (myMap.keys - myList):通过集合差集运算实现,语义偏底层,不够直观,适合熟悉集合运算的场景。
  • myMap.toMutableMap().apply { keys.retainAll(myList) }:属于命令式写法,需要先转成可变Map再修改,不如声明式的filterKeys简洁直观。

实现你想要的直观写法

如果你偏好myMap.retainAll(myList)这种语义明确的调用方式,可以自己写一个扩展函数:

// 返回新的不可变Map,不修改原Map
fun <K, V> Map<K, V>.retainAll(keysToKeep: Collection<K>): Map<K, V> {
    return filterKeys { it in keysToKeep }
}

调用方式完全符合你的预期:

val newMap = myMap.retainAll(myList)

如果需要操作可变Map并修改原对象,可以调整扩展函数:

// 修改原可变Map并返回自身
fun <K, V> MutableMap<K, V>.retainAll(keysToKeep: Collection<K>): MutableMap<K, V> {
    keys.retainAll(keysToKeep)
    return this
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 11:42:42