Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.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,我试图找到更好的方法来链接Kotlin中的过滤器和映射操作符。我要做的是在转到map操作符之前过滤空项 我能够链接它们,但编译器抱怨我的列表项的可空性 class Person(val age : String?) fun foo(age :String){ // require non-null age } 示例用法为: val list = mutableListOf(Person("3"), Person("2")) list.filt

我试图找到更好的方法来链接Kotlin中的
过滤器
映射
操作符。我要做的是在转到
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) }

但我认为这是不可读的。或者您可以直接使用
-如果我们知道自己在做什么,那就没那么糟糕了。

谢谢你指出这一点!这正是我要找的。谢谢你指出这一点!这正是我要找的。