gpt4 book ai didi

kotlin - 同时转换映射和过滤空结果的惯用方法

转载 作者:行者123 更新时间:2023-12-03 09:03:10 24 4
gpt4 key购买 nike

我正在尝试映射 table = Map<K, V> 的键与 f: (K) -> M?并得到 Map<M, V> 。然而,我所有的尝试都有点臭:

  • table.mapKeys{ f(it.key) }.filter{it != null} as Map<M, V>似乎是最简单的,但必须从 Map<M?, V> 进行转换至Map<M, V>手动。未经检查的强制转换避开了空检查“生态系统”,这似乎关闭了(并导致 IDE 提示)。

  • table.filterKeys(f(it) != null).mapKeys(f)很简单,但适用f两次,感觉很愚蠢。

  • 我也考虑过 table.mapNotNull { f(it.key)?.let {res -> res to it.value} }.toMap() ,但是创建中间列表非常没有吸引力。

我感觉应该有一种简单的声明式(即没有 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> {
val destination = LinkedHashMap<R, V>()
forEach { element -> transform(element)?.let { destination.put(it, element.value) } }
return destination
}

无论哪种方式,您尝试使用上面的方法进行的调用都将如下所示:

table.mapKeysNotNull(f)

关于kotlin - 同时转换映射和过滤空结果的惯用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48878213/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com