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

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

 fun  sequence(a : List) : List? { 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

在Kotlin中expression我想要的东西的惯用方式是什么? 使用Java的Optionaltypes,这至少是可编译的:

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

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

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

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

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

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