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



看一下这个kotlin一个衬里:

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

编译器在此行中给出类型错误,称无法将无效的列表分配给非杀程序列表。但是滤波器条件确保列表仅包含非零值。在这种情况下,我可以使用与!!操作员类似的东西来编译此代码吗?

假设编译器会考虑到谓词

似乎是合乎逻辑的
it != null

并将类型推断为

List<NonNullType>

但不是。
有2个解决方案:

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

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

据我所知,仅通过验证它们不是null而无法将无效的类型转换为非null类型。为了实现所需的目标,您需要通过简单地创建非null类型对象来手动映射可将其映射到非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()

希望它能帮助您!

您无法将无效类型分配给不可删除的值。当您分配一个值时,类型匹配可能有效,而不是在调用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()

>

相关内容

  • 没有找到相关文章

最新更新