null to listOf(),在一个班轮中Kotlin中的listOf(value)不为null?

时间:2017-05-26 02:08:20

标签: null kotlin option kotlin-null-safety

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: ... = ...,
    ...)

这看起来很丑陋,不是吗?

2 个答案:

答案 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())