从Kotlin中的集合中滤除非null值

时间:2019-02-15 13:20:52

标签: kotlin null nullable kotlin-null-safety

看看这种kotlin衬垫:

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

编译器在此行给出类型错误,表示不能将可为空的列表分配给非空列表。但是过滤器条件可确保列表仅包含非null值。在这种情况下是否可以使用类似于!!的运算符来使此代码编译?

3 个答案:

答案 0 :(得分:6)

合理的假设是编译器会考虑谓词

it != null

并将类型推断为

List<NonNullType>

但不是。
有两种解决方案:

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

val nonNullList: List<NonNullType>  = nullableArray.mapNotNull { it }

答案 1 :(得分:0)

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

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()

希望对您有帮助!

答案 2 :(得分:0)

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

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

相反,如果您要执行此操作而不会出现错误或与类型无关。从val中删除类型,就像这样

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

希望有帮助