在Kotlin中包含可为空的列表的列表

我有一个List<T?>包含空值(我想这是不禁止的)。 如果这个列表中的一个元素为空,我希望整个列表为null(Haskell人们称之为sequence )。 下面的伪代码演示了我想要做的事情:

 fun <T> sequence(a : List<T?>) : List<T>? { return a.fold( listOf(), { prevArray, element -> if(element == null) null else prevArray + element }) } 

这是伪代码,因为编译器抱怨Null can not be a value of a non-null type kotlin.collections.List<T>

在Kotlin中表达我想要的东西的惯用方式是什么? 使用Java的Optional类型,这至少是可编译的:

 fun <T> sequence(a : List<T?>) : Optional<List<T>> { return a.fold( Optional.of(listOf()), { prevArray, element -> if(element == null) Optional.empty<List<T>>() else Optional.of(prevArray + element) }) } 

但是Kotlin有许多关于空值处理的操作符和功能,所以我认为直接使用null会更加地道。

您可以使用非本地返回从sequence函数返回:

 fun <T> sequence(a: List<T?>): List<T>? { return a.fold(listOf()) { prevArray, element -> if (element == null) return null else prevArray + element } } 

不过,我会用一个简单的if表达式来解决你所描述的问题,以防止发生大量的列表分配,因为列表添加会为每个元素创建一个由数组支持的新列表。 未经检查的转换警告在下面被抑制,因为编译器不能确定该列表在那一点上不包含空值,尽管我们可以清楚地看到这种情况:

 fun <T> sequence(a: List<T?>): List<T>? { @Suppress("UNCHECKED_CAST") return if (a.any { it == null }) null else a as List<T> }