从 kotlin 中的集合中过滤掉非空值
Filtering out non null values from a collection in kotlin
看看这个 kotlin one liner:
val nonNullArr : List<NonNullType> = nullArray.filter {it != null}
编译器在这一行给出类型错误,表示不能将可空列表分配给非空列表。但是条件过滤器确保列表只包含非空值。在这种情况下,我可以使用类似于 !!
运算符的东西来编译此代码吗?
据我所知,您不能仅通过验证它们不为空来将可空类型转换为非空类型。要实现您想要的,您需要通过简单地创建 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()
希望对您有所帮助!
假设编译器会考虑谓词似乎合乎逻辑
it != null
并将类型推断为
List<NonNullType>
但事实并非如此。
有2种解决方案:
val nonNullList: List<NonNullType> = nullableArray.filterNotNull()
或
val nonNullList: List<NonNullType> = nullableArray.mapNotNull { it }
您不能将可空类型分配给不可空类型的值。
当您分配一个值时,类型匹配可能会起作用,而不是在调用 filter
操作之后。
// the type-matching works before `.filter` is called
val nonNullArr : List<NonNullType> = nullArray//.filter {it != null}
相反,如果您想在不出错或不考虑类型的情况下执行此操作。从 val
中删除类型,所以它是这样的
val nonNullArr = nullArray.filter {it != null}
希望对您有所帮助
尝试使用 listOfNotNull 而不是 listOf(),它等同于 list.filterNotNull()
看看这个 kotlin one liner:
val nonNullArr : List<NonNullType> = nullArray.filter {it != null}
编译器在这一行给出类型错误,表示不能将可空列表分配给非空列表。但是条件过滤器确保列表只包含非空值。在这种情况下,我可以使用类似于 !!
运算符的东西来编译此代码吗?
据我所知,您不能仅通过验证它们不为空来将可空类型转换为非空类型。要实现您想要的,您需要通过简单地创建 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()
希望对您有所帮助!
假设编译器会考虑谓词似乎合乎逻辑
it != null
并将类型推断为
List<NonNullType>
但事实并非如此。
有2种解决方案:
val nonNullList: List<NonNullType> = nullableArray.filterNotNull()
或
val nonNullList: List<NonNullType> = nullableArray.mapNotNull { it }
您不能将可空类型分配给不可空类型的值。
当您分配一个值时,类型匹配可能会起作用,而不是在调用 filter
操作之后。
// the type-matching works before `.filter` is called
val nonNullArr : List<NonNullType> = nullArray//.filter {it != null}
相反,如果您想在不出错或不考虑类型的情况下执行此操作。从 val
中删除类型,所以它是这样的
val nonNullArr = nullArray.filter {it != null}
希望对您有所帮助
尝试使用 listOfNotNull 而不是 listOf(),它等同于 list.filterNotNull()