首页 文章

在Kotlin中该类外部的函数中处理类中字段的空值

提问于
浏览
0
class StuffContainer(var stuff: MutableList<String>?) {
    fun appendSomeStuff(newStuff: List<String>) { // Appends to stuff, initialising it if null
        stuff?.addAll(newStuff) ?: let { stuff = ArrayList<String>(newStuff) }
    }
}

fun main (args: Array<String>) {
    val container = StuffContainer(null)

    val arr : ArrayList<String> = ArrayList()
    arr.add("abc")
    arr.add("bcd")

    // Now I want to put arr in container
    container.appendSomeStuff(arr)
    println(container.stuff) // [abc, bcd]

    // That worked. Now how to implement the logic in StuffContainer.appendSomeStuff here?
    container.stuff = null
    //container.stuff?.addAll(arr) ?: let { container.stuff = ArrayList<String>(arr) }
    // Can't write a let expression here

    if (container.stuff == null) {
        container.stuff = ArrayList<String>(arr)
    } else {
        container.stuff?.addAll(arr)
    }
    println(container.stuff) // [abc, bcd]
}

这是我所拥有的代码的精简版本 . 在上面的代码中,我编写了一个main,以便可以复制和执行它 . 但在实际使用中,我有一个函数,它将“StuffContainer”对象作为参数 .

我无法弄清楚如何在类中定义的函数中正确处理类中字段的空值 . 我不能使用let表达式,所以我使用if-else块 .

这是最好的方法吗?尽管在if块的空检查之后"container"设置为null时,所有kotlin 's attempts to avoid bugs due to vars being set to null from somewhere, this code won' t都能正常工作 . 有没有更好的办法?

1 回答

  • 0

    TLDR

    你想做这样的事情 .

    when {
            container.stuff == null -> container.stuff = ArrayList<String>(arr)
            else -> container.stuff?.addAll(arr)
        }
    

    要么

    container.stuff = container.stuff ?: ArrayList(arr)
    

    可能有更好的方法来做到这一点 .

    Explanation

    你期望使用这样的东西

    container.stuff?.addAll(arr) ?: let { container.stuff = ArrayList<String>(arr) }
    

    我在做什么?

    首先,您当前使用 let 方法的方式似乎有点不对 . 在特定数据项上调用 let 函数,其中将计算表达式传递给lambda .

    仅当表达式求值为NOT null时才调用该函数 .

    为什么这是错的?

    • 不会以这种方式调用let函数

    这会有用吗?

    container.stuff?.addAll(arr)?.let { container.stuff = ArrayList<String>(arr) }
    

    这也不起作用,因为 container.stuff 为空,因此不会调用 addAll 函数,因此它不会进入 let 块 .

相关问题