首页 文章

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

提问于
浏览
0

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 回答

  • 4

    编辑

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

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

    将返回所有非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

  • 1

    对于这个具体问题,我能做到

    listOfNotNull(f())
    

相关问题