Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 同时转换映射和过滤空结果的惯用方法_Kotlin - Fatal编程技术网

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
    转换到
    Map
    。未经检查的强制转换避开了空检查“生态系统”,它似乎关闭了(并导致IDE发出呜呜声)

  • 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)