7

看看这个 kotlin one liner:

val nonNullArr : List<NonNullType> = nullArray.filter {it != null}

编译器在这一行给出了一个类型错误,说不能将可空值列表分配给非空值列表。但过滤条件确保列表将仅包含非空值。!!在这种情况下我可以使用类似于运算符的东西来编译这段代码吗?

4

4 回答 4

8

假设编译器会考虑谓词似乎是合乎逻辑的

it != null

并将类型推断为

List<NonNullType>

但事实并非如此。
有2个解决方案:

val nonNullList: List<NonNullType>  = nullableArray.filterNotNull()

或者

val nonNullList: List<NonNullType>  = nullableArray.mapNotNull { it }
于 2019-02-15T13:36:54.087 回答
1

据我所知,您不能仅通过验证它们不为空来将可空类型转换为非空类型。要实现您想要的,您需要通过简单地创建 NonNull 类型对象来手动将可空值映射到非空类型。为此,您可以使用地图扩展功能。

val nullableArray: Array<String?> = arrayOf("abc", "xyz", null, "efg")

val nonNullList: List<String> = nullableArray.filter { it != null }.map {
    it.toString()
}

或者您可以使用filterNotNull()评论中建议的@forpas 方法

val nonNullList: List<String>  = nullableArray.filterNotNull()

希望对你有帮助!

于 2019-02-15T13:35:36.960 回答
1

您不能将可空类型分配给不可空类型的值。类型匹配可能在您分配值时起作用,而不是在filter调用操作之后。

// the type-matching works before `.filter` is called
val nonNullArr : List<NonNullType> = nullArray//.filter {it != null} 

相反,如果您想在没有错误或不考虑类型的情况下执行此操作。从 中删除类型val,所以它是这样的

val nonNullArr = nullArray.filter {it != null} 

希望能帮助到你

于 2019-02-16T15:11:08.273 回答
0

尝试使用listOfNotNull代替 listOf(),它等效于list.filterNotNull()

于 2020-12-24T08:24:08.420 回答