简化IF语句中对空变量的测试

时间:2019-06-24 11:53:24

标签: kotlin

在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中,还有更雄辩的方法吗?

4 个答案:

答案 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 ?.本身来完成。因此,如果您只想遍历列表(或reducemap或其他任何内容),则可以直接进行以下操作:

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
}

使用takeIftakeUnless(取决于您的要求),然后根据条件增强它也很容易:

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才有意义: