让 f()
返回一个可以为空的值 .
我想做的是
如果 f()
为null,则获取一个空列表,
否则如果 f()
不为null,则获取单个项目 value
的列表 .
在Scala中,我们可以这样做:
Option(f()).toList
或者更详细
Option(f()).map(v => List(v)).getOrElse(List.empty)
在Kotlin中,没有 Option
(假设没有Funktionale库),而且在Scala中,null与 toList()
不同( 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: ... = ...,
...)
这看起来很难看,不是吗?
2 回答
编辑
正如@Naetmul指出的那样,
listOfNotNull(f())
在语法上比我最初发布的更好,并且还采用了可变数量的参数,例如将返回所有非null结果的列表 .
我会在这里使用 .
val myList = f()?. let {listOf(it)}?:emptyList()
用一个 ? . 安全调用f()的返回值,然后使用let运行代码块 . 如果f()为null,则不会运行此代码块,从而导致null值 . 然后我们使用?:elvis运算符回退到空列表 . 这里分为几行,以便更好地理解val myValue = f()
val myList:List <Any>
if(myValue!= null) else
对于这个具体问题,我能做到