null a listOf (), no nulo a listOf (value) en Kotlin en un trazador de líneas?

Deje que f() devuelva un valor que admite nulos.

Lo que quiero hacer es eso
si f() es nulo, obtenga una list vacía,
de lo contrario, si f() no es nulo, obtenga una list del value artículo individual.

En Scala, podemos hacer algo como esto:

 Option(f()).toList 

o más ampliamente

 Option(f()).map(v => List(v)).getOrElse(List.empty) 

En Kotlin, no hay Option (suponiendo que no hay biblioteca Funktionale), y null no tiene que toList() diferencia ( None: Option ) en Scala.

Tenemos el operador de Elvis, pero nulo estará dentro de la function listOf() , por lo que será

 listOf(f() ?: /* What can I do here? */) 

Lo que queremos para null es listOf(/*no argument */) , pero el operador de Elvis requiere un argumento, por lo que listOf(f() ?: ) Dará como resultado un error de compilation.

Al less podemos hacer

 val v = f() if (v == null) listOf() else listOf(v) 

pero es un trazador de líneas dos.

¿Hay alguna expresión para esto?

Donde usaré esta expresión está en el argumento pnetworkingeterminado del constructor primario de la class, así que si no es un trazador de líneas único, se includeá entre corchetes, así que algo como esto:

 class A( val p1: List<V> = run { val v = f() if (v == null) listOf() else listOf(v) }, val p2: ... = ..., ...) 

Esto se ve bastante feo, ¿no?

EDITAR

Como señaló @Naetmul, listOfNotNull(f()) es sintácticamente mejor que lo que originalmente publiqué a continuación, y también toma una cantidad variable de arguments, por ejemplo

 val myList = listOfNotNull(f(), g(), h()) 

devolverá una list de todos los resultados que no fueron nulos.


Yo usaría let aquí.

 val myList = f()?.let { listOf(it) } ?: emptyList() 

Use un ?. llamada segura en el valor de retorno de f() , luego use let para ejecutar un bloque de código. Si f() es nulo, no ejecutará este bloque de código, lo que dará como resultado un valor nulo. Luego usamos el operador ?: Elvis para volver a una list vacía.

Aquí se divide en varias líneas para una mejor comprensión

 val myValue = f() val myList: List<Any> if (myValue != null) { myList = listOf(myValue) } else { myList = emptyList() } 

Para esta pregunta específica, puedo hacer

 listOfNotNull(f())