Lista que contiene valores anulables a una Lista anulable en Kotlin

Tengo una List<T?> Que contiene valores nulos (que, supongo, no está prohibido). Si un elemento de esta list es nulo, quiero que toda la list sea nula (lo que la gente de Haskell llama sequence ). El siguiente pseudocódigo demuestra lo que quiero hacer:

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

Esto es un pseudocódigo porque el comstackdor se queja de que Null can not be a value of a non-null type kotlin.collections.List<T> .

¿Cuál es la forma idiomática de express lo que quiero en Kotlin? Usando el tipo Optional de Java, esto es al less comstackble:

 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) }) } 

Pero Kotlin tiene muchos operadores y funcionalidades con respecto al manejo nulo, así que pensé que usar null directamente sería más idiomático.

Puede usar un retorno no local para regresar de la function de sequence :

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

Sin embargo, resolvería el problema que describió con una simple expresión-y, para evitar muchas asignaciones de lists que ocurren porque la adición de lists crea una nueva list respaldada por una matriz para cada elemento. La advertencia de conversión desactivada se suprime a continuación porque el comstackdor no puede darse count de que la list no contiene nulos en ese punto, aunque podemos ver claramente que ese es el caso:

 fun <T> sequence(a: List<T?>): List<T>? { @Suppress("UNCHECKED_CAST") return if (a.any { it == null }) null else a as List<T> } 
  • Cómo sobrecargar constructores en kotlin difiere en el tipo de retorno lambda
  • Usar Kotlin en un module de biblioteca sin usarlo en el module de la aplicación
  • Kotlin: syntax adecuada "si el elemento no está en la list"
  • La request de arranque de spring se cuelga allí cuando devuelve el código de estado 1xx
  • ¿Cómo pruebo generadores para properties delegadas?
  • El order de ejecución de los grupos es incorrecto en Kotlin Spek
  • Kotlin ingresó como un BigInteger
  • ¿Qué es una forma concisa de copyr profundamente una MutableList 2D?
  • La image existe, no es nula, pero obtengo una NullPointerException en ella
  • ¿Cómo almacenar datos json cuando uso Android Studio 3.0?
  • La aplicación del complemento Realm en el proyecto Kotlin produce un error de compilation