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> } 
  • JUnit, @ControllerAdvice y la falta de excepciones marcadas en Kotlin
  • En Android Java / Kotlin, ¿la implementación de una interfaz le da acceso directo a las variables locales de la class de anidación?
  • Kotlin Date.daysDespués de la function diferente valor de retorno con los mismos arguments
  • La construcción de Android Studio falló con Kotlin
  • kotlin android - Xposed IllegalArgumentException 'android.content.res.CoollifeUITpedArray'
  • Cómo establecer el valor de propiedad pnetworkingeterminado de Kotlin a `this`
  • Usar en operador para comparar cadena con range de cadenas
  • Orden de datos de spring por function de Java
  • Kotlin en Android: no se puede encontrar el manifiesto principal fusionado. Que esta causando este error?
  • La información no se carga correctamente en Firebase-Firerestre
  • Motivo de la precedencia de los operadores con un tipo en el lado derecho