在Kotlin中,我有一个(不会编译):
var list: MutableList<String>? = null
if (list.isNotEmpty()) {
}
这将编译:
var list: MutableList<String>? = null
if (list!!.isNotEmpty()) {
}
但是,如果list为null,则会发生运行时异常。我可以这样做:
var list: MutableList<String>? = null
if ((list != null) && list.isNotEmpty()) {
}
但是,这似乎在需要测试是否为空的地方都是重复的。在Kotlin中,还有更雄辩的方法吗?
答案 0 :(得分:3)
在检查列表是否为空或为空的特定情况下,可以使用:
if (!list.isNullOrEmpty())
答案 1 :(得分:1)
对于列表,最好避免处理空状态,而只处理空和非空状态。请参阅http://thefinestartist.com/effective-java/43。
说,我们不需要显式检查null检查,只有空检查才可以解决问题。
var list : MutableList<String> = mutableListOf()
list.add("Test1")
list.takeIf { it.isNotEmpty() }?.forEach { println(it) }
我们可以使用
takeIf
检查列表是否为空。
答案 2 :(得分:0)
第一种方法添加此行
list = list?:MutableList<String>()
第二种方法
val isEmpty = list.isEmpty()?:false
if(isEmpty){}else{}
第三种方式
if (!list.isNullOrEmpty())
按照@AndroidDev的建议
为什么会出现错误?由于!!
要求非null。如果对象为null,则它将抛出NPE
答案 3 :(得分:0)
我认为大多数可以通过safe operator ?.
本身来完成。因此,如果您只想遍历列表(或reduce
,map
或其他任何内容),则可以直接进行以下操作:
val sumExpression = list?.joinToString("+") { it.someValue } ?: throw exception? use default value?
list?.forEach { println("an entry in the list: $it") } // if there are entries, just iterate over them... if not, there is nothing to do
list?.also {
consume(it) // consume now is only called if the list is not null
}
使用takeIf
或takeUnless
(取决于您的要求),然后根据条件增强它也很容易:
list?.takeIf { it.isNotEmpty() }
现在您仍然具有可为空的列表,并且可以再次调用任何所需的函数,如前所示:
list?.takeIf( it.isNotEmpty() }?.also {
consume(it)
}
还有一种变体代替list.isNullOrEmpty()
(已经由gpuntos answer表示)是将可能的空值与预期结果进行比较,例如:
if(list?.isNotEmpty() == true) {
// do something with the non-empty list
}
在null
的情况下,条件基本上简化为null == true
,即false
。但是,我不会过度使用它,因为您再也看不到实际的可空类型了。如果您要计算的内容本身的扩展功能(如isNullOrEmpty()
尚不支持),则这样的用法可能有意义。仅在if
为4时输入count
才有意义: