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,以便可以复制和执行它。但在实际使用中,我有一个函数可以得到一个&#34; StuffContainer&#34;对象作为论据。
我无法弄清楚如何在类中定义的函数中正确处理类中字段的空值。 我不能使用let表达式,所以我使用了if-else块。
这是最好的方法吗? 尽管kotlin尝试避免由于某些地方的vars被设置为null而导致的bug,但是这个代码在&#34; container&#34;之后无法正常工作。在if块的空检查之后, 设置为null。还有更好的方法吗?
答案 0 :(得分:0)
TLDR :
你想做这样的事情。
when {
container.stuff == null -> container.stuff = ArrayList<String>(arr)
else -> container.stuff?.addAll(arr)
}
OR
container.stuff = container.stuff ?: ArrayList(arr)
可能有更好的方法。
解释:
你期望使用类似这样的东西
container.stuff?.addAll(arr) ?: let { container.stuff = ArrayList<String>(arr) }
我在做什么?
首先,您当前使用let
方法的方式似乎有点不对。在特定数据项上调用let
函数,其中将计算表达式传递给lambda。
仅当表达式求值为NOT null时才调用该函数。
为什么这是错的?
这会有用吗?
container.stuff?.addAll(arr)?.let { container.stuff = ArrayList<String>(arr) }
这也不起作用,因为container.stuff
为空,因此不会调用addAll
函数,因此它不会进入let
块。