如何在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
相关产品推荐
相关产品推荐

