generics - 在 Kotlin 中从映射中过滤空键和值

标签 generics kotlin extension-function

我有一个扩展函数,可以过滤掉具有空键或值的条目:

fun <K, V> Map<K?, V?>.filterNotNull(): Map<K, V> = this.mapNotNull { 
   it.key?.let { key -> 
      it.value?.let { value -> 
         key to value 
      }
   }
}.toMap()

这适用于具有可为空键和值的映射:

data class Stuff(val foo: Int)

val nullMap = mapOf<String?, Stuff?>(null to (Stuff(1)), "b" to null, "c" to Stuff(3))
assert(nullMap.filterNotNull().map { it.value.foo } == listOf(3))

但不适用于具有不可为空键或值的键或值:

val nullValues = mapOf<String, Stuff?>("a" to null, "b" to Stuff(3))    
assert(nullValues.filterNotNull().map { it.value.foo } == listOf(3))

Type mismatch: inferred type is Map<String, Stuff?> but Map<String?, Stuff?> was expected
Type inference failed. Please try to specify type arguments explicitly.

有没有办法让我的扩展函数适用于这两种情况,或者我是否需要提供两个单独的函数?

最佳答案

我稍后会找出原因,但添加到 map 中是有效的:

fun <K : Any, V : Any> Map<out K?, V?>.filterNotNull(): Map<K, V> = ...

关于generics - 在 Kotlin 中从映射中过滤空键和值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58799864/

相关文章:

kotlin - 如何重载具有相同参数类型但可以为空的函数

kotlin - 扩展函数可以以 "static"的方式调用吗?

c# - 泛型方法中的 InvalidCastException

c#通用转换器

Swift - 动态匹配类

java - 使用 Mockito 返回泛型和基元的模拟方法

java - 如何解决垂直 RecyclerView 内水平 ViewPager2 和 RecyclerView 的滚动问题?

kotlin - 如何使用 Gradle Kotlin buildSrc 插件自定义 KotlinCompile 任务?

string - 使用扩展功能将String中的每个单词大写

kotlin - 我可以在类外使用扩展 *member* 吗?