如何在Kotlin中映射没有断言的非空元素?
我试图找到更好的方法来链接Kotlin中的如何在Kotlin中映射没有断言的非空元素?,kotlin,Kotlin,我试图找到更好的方法来链接Kotlin中的过滤器和映射操作符。我要做的是在转到map操作符之前过滤空项 我能够链接它们,但编译器抱怨我的列表项的可空性 class Person(val age : String?) fun foo(age :String){ // require non-null age } 示例用法为: val list = mutableListOf(Person("3"), Person("2")) list.filt
过滤器
和映射
操作符。我要做的是在转到map
操作符之前过滤空项
我能够链接它们,但编译器抱怨我的列表项的可空性
class Person(val age : String?)
fun foo(age :String){
// require non-null age
}
示例用法为:
val list = mutableListOf(Person("3"), Person("2"))
list.filter{ it.age != null }.map{ foo(it.age) }
// The IDE wants me to add !!
那么,为什么Kotlin不能推断为空呢?传递给映射的已筛选(所有非空)项应已筛选,以确保它们非空。您可以在此处使用扩展函数,该函数将返回不可空类型的列表
在您的情况下,编译器只是不够先进,无法智能地转换过滤列表,这将是一个相当多的要求。因此,如果您需要特别使用过滤器
,则必须添加断言。您可以在此处使用扩展函数,该函数将返回不可为空类型的列表
在您的情况下,编译器只是不够先进,无法智能地转换过滤列表,这将是一个相当多的要求。因此,如果您需要特别使用
过滤器
,则必须添加断言。您可以用一种方法替换过滤器
和映射
:
val list2=list.mapNotNull{it.age}
您可以用一种方法替换过滤器
和映射
:
val list2=list.mapNotNull{it.age}
这种情况对人类来说似乎很容易,但从技术上讲,编译器很难理解,在过滤后,它是一个人
对象的列表,但其年龄
属性的类型与原始属性不同
如果在map()
阶段不使用整个people
实例,那么我认为最简单的方法是:
list
.mapNotNull { it.age }
.map(::foo)
或者,如果您的foo()
无法返回空值:
list.mapNotNull { it.age?.let(::foo) }
但我认为这是不可读的。或者您可以直接使用
代码>-如果我们知道我们在做什么,那就没那么糟糕了。这种情况对人类来说似乎很容易,但从技术上讲,编译器很难理解,在过滤后,它是一个人
对象的列表,但与原始对象具有不同类型的年龄
属性
如果在map()
阶段不使用整个people
实例,那么我认为最简单的方法是:
list
.mapNotNull { it.age }
.map(::foo)
或者,如果您的foo()
无法返回空值:
list.mapNotNull { it.age?.let(::foo) }
但我认为这是不可读的。或者您可以直接使用代码>-如果我们知道自己在做什么,那就没那么糟糕了。谢谢你指出这一点!这正是我要找的。谢谢你指出这一点!这正是我要找的。