2

f()返回一个可为空的值。

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

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

Option(f()).toList

或更详细地说

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

在 Kotlin 中,没有(假设没有 Funktionale 库),并且 null在 ScalaOption中没有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: ... = ...,
    ...)

这看起来很丑,不是吗?

4

2 回答 2

6

编辑

正如@Naetmul 指出的那样,listOfNotNull(f())在语法上比我最初在下面发布的更好,并且还采用可变数量的参数,例如

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

将返回所有非空结果的列表。


我会let在这里使用。

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

对 的返回值使用?.安全调用f(),然后使用let运行代码块。如果f()为 null,则不会运行此代码块,从而产生 null 值。然后我们使用?:elvis 运算符回退到一个空列表。

这里分成几行以便更好地理解

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

于 2017-05-26T03:03:43.177 回答
3

对于这个特定的问题,我可以做

listOfNotNull(f())
于 2017-06-18T07:21:00.257 回答