2017-05-26 123 views
0

f()返回一个可为空的值。null to listOf(),not null to listOf(value)in Kotlin in one liner?

我想要做的是,
如果f()为空,得到一个空列表,
否则,如果f()不为空,获得单项value的列表。

在Scala中,我们可以做这样的事情:

Option(f()).toList 

以上冗长

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

在科特林,没有Option(假设没有Funktionale库),以及空没有toList()不像(None: Option)在斯卡拉。

我们有埃尔维斯操作,但空将是listOf()功能里面,所以这将是

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

我们要为空是什么listOf(/*no argument */),但猫王运营商需要一个参数,所以listOf(f() ?:)将导致在编译错误。

至少我们可以做

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

,但它是一个两个衬垫。

这是否有一些表达?

在哪里,我会用这句话是在类的主构造默认参数,因此,如果它不是一个衬垫,它会用括号括起来,所以是这样的:

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

这看起来相当丑,不是吗?

回答

4

编辑

由于@Naetmul指出,listOfNotNull(f())在语法上是不如我原来贴在下面,同时还采用可变数量的参数,例如

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

会返回一个列表所有非空的结果。


我会在这里使用 let

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

上的f()返回值使用?. safe call,然后用let运行的代码块。如果f()为null,则不会运行此代码块,从而生成空值。然后我们使用?: elvis operator回退到空列表。

这被分解成几行,以更好地理解

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

1

对于这个具体问题,我可以做

listOfNotNull(f())