我有以下代码:
class Countries {
var list: MutableList<String>? = null
}
val countries = Countries()
if (countries.list!!.isNotEmpty()) {
}
在运行时,这将引发异常,因为list为null。我可以改为:
if ((countries.list != null) && countries.list!!.isNotEmpty()) {
}
如果我有一个名为areInitialized的布尔成员,该布尔成员可以为空,那么我可以创建一个类似infix的函数:
infix fun Any?.ifTrue(block: () -> Unit) {
if ((this != null) && this == true) block()
}
然后像这样使用它:
countries.areInitialized ifTrue {
}
但是我似乎无法为可变列表创建类似的内容。
但是我讨厌不得不在代码的其他部分的成员字段上重复此测试以使null为空。 Kotlin中有更简单的方法可以做到这一点吗?
答案 0 :(得分:0)
我会尽可能地坚持标准。因此,在您的示例中,我不会介绍该ifTrue
函数,而是将takeIf
或takeUnless
与safe operator ?.
结合使用,例如:
countries?.takeIf { it.areInitialized == true }
?.also {
/* do something with countries */
}
或者,如果您必须返回一个值,请将also
与let
交换(或查看其他scope functions)。
然后,同样适用于countries
中的列表:
countries?.takeUnless { it.list.isNullOrEmpty() }
?.also {
/* do something with countries */
it.list!!.forEach(::println)
}