看一下这个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()
>