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 回答
TLDR :
你想做这样的事情 .
要么
可能有更好的方法来做到这一点 .
Explanation :
你期望使用这样的东西
首先,您当前使用
let
方法的方式似乎有点不对 . 在特定数据项上调用let
函数,其中将计算表达式传递给lambda .仅当表达式求值为NOT null时才调用该函数 .
这也不起作用,因为
container.stuff
为空,因此不会调用addAll
函数,因此它不会进入let
块 .