Kotlin 同时转换映射和过滤空结果的惯用方法
我试图用Kotlin 同时转换映射和过滤空结果的惯用方法,kotlin,Kotlin,我试图用f:(K)->m?映射table=map的键,并得到map。然而,我所有的尝试都有点臭: table.mapKeys{f(it.key)}.filter{it!=null}as Map似乎是最简单的,但必须手动从Map转换到Map。未经检查的强制转换避开了空检查“生态系统”,它似乎关闭了(并导致IDE发出呜呜声) table.filterKeys(f(it)!=null).mapKeys(f)很简单,但是应用了f两次,感觉很愚蠢 我还考虑了table.mapNotNull{f(it.k
f:(K)->m?
映射table=map
的键,并得到map
。然而,我所有的尝试都有点臭:
似乎是最简单的,但必须手动从table.mapKeys{f(it.key)}.filter{it!=null}as Map
转换到Map
。未经检查的强制转换避开了空检查“生态系统”,它似乎关闭了(并导致IDE发出呜呜声)Map
很简单,但是应用了table.filterKeys(f(it)!=null).mapKeys(f)
两次,感觉很愚蠢f
- 我还考虑了
,但是创建中间列表非常不吸引人table.mapNotNull{f(it.key)?.let{res->res to it.value}}.toMap()
我觉得应该有一种简单的声明式(即no
MutableMap
)方法来实现这种转换,但我找不到它。您可以添加一些实用程序函数来实现这一点:
inline fun <K, V, R : Any> Map<K, V>.mapKeysNotNull(transform: (Map.Entry<K, V>) -> R?): Map<R, V> {
return mapKeysNotNullTo(LinkedHashMap(), transform)
}
inline fun <K, V, R : Any> Map<K, V>.mapKeysNotNullTo(destination: MutableMap<R, V>, transform: (Map.Entry<K, V>) -> R?): Map<R, V> {
forEach { element -> transform(element)?.let { destination.put(it, element.value) } }
return destination
}
您可以添加一些实用程序函数,自己完成这项工作:
inline fun <K, V, R : Any> Map<K, V>.mapKeysNotNull(transform: (Map.Entry<K, V>) -> R?): Map<R, V> {
return mapKeysNotNullTo(LinkedHashMap(), transform)
}
inline fun <K, V, R : Any> Map<K, V>.mapKeysNotNullTo(destination: MutableMap<R, V>, transform: (Map.Entry<K, V>) -> R?): Map<R, V> {
forEach { element -> transform(element)?.let { destination.put(it, element.value) } }
return destination
}
table.mapKeysNotNull(f)