让f()
返回可以为空的值。
我想做的是
如果f()
为空,请获取一个空列表,
否则如果f()
不为空,请获取单个项目value
的列表。
在Scala中,我们可以这样做:
Option(f()).toList
或更详细
Option(f()).map(v => List(v)).getOrElse(List.empty)
在Kotlin中,没有Option
(假设没有Funktionale库),而且与Scala中的toList()
不同,null没有None: Option
。
我们有Elvis运算符,但null将在listOf()
函数内,所以它将是
listOf(f() ?: /* What can I do here? */)
我们想要null的是listOf(/*no argument */)
,但是Elvis运算符需要一个参数,因此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: ... = ...,
...)
这看起来很丑陋,不是吗?
答案 0 :(得分:5)
修改的
正如@Naetmul指出的那样,logging
在语法上比我最初发布的内容更好,并且还采用了可变数量的参数,例如
listOfNotNull(f())
将返回所有非空的结果列表。
我会在这里使用 val myList = listOfNotNull(f(), g(), h())
。
let
在val myList = f()?.let { listOf(it) } ?: emptyList()
的返回值上使用?.
safe call,然后使用f()
运行代码块。如果let
为null,则不会运行此代码块,从而导致null值。然后我们使用?:
elvis operator回退到空列表。
这里分为几行以便更好地理解
f()
击> <击> 撞击>
答案 1 :(得分:1)
对于这个具体问题,我可以做到
listOfNotNull(f())