使用布尔值?如果表达

nha*_*man 112 null kotlin

如果我有一个可空的Boolean b,我可以在Java中进行以下比较:

Boolean b = ...;
if (b != null && b) {
   /* Do something */
} else {
   /* Do something else */
}
Run Code Online (Sandbox Code Playgroud)

在Kotlin中,我可以通过使用!!运算符来实现相同的目的:

val b: Boolean? = ...
if (b != null && b!!) {
   /* Do something */
} else {
   /* Do something else */
}
Run Code Online (Sandbox Code Playgroud)

然而,!!对我来说使用感觉有点粗略,绕过零安全系统.

有更优雅的方法吗?


编辑似乎我有点过分了.对于局部变量,如Banthar所示,它确实有效.但是,我的布尔b实际上是一个"具有支持字段的属性"(我实际上并没有达到速度,而是强加了它).这是结果:

在此输入图像描述

Ily*_*lya 166

你可以比较可空布尔值true,falsenull使用相等运算符:

var b: Boolean? = null
if (b == true) {
    // b was not null and equal true
} 
if (b == false) {
   // b is false 
}
if (b != true) { 
   // b is null or false 
}
Run Code Online (Sandbox Code Playgroud)

  • @Richard有助于认为b有3个可能的值:`true`,`false`或`null`.然后当做`if(b!= true)`你只知道b不是真的,但你对`false`或`null`一无所知 (7认同)
  • eg2 .if(b!= true)// b为null或false`例如3.`if(b == false)// b为false (7认同)
  • 注意:似乎不适用于逆运算符`!` (4认同)
  • 这是正确的答案,并且在 Kotlin 中有意义,但是来自 Java 背景,在 if 语句中显式比较 true 或 false 或 null 可能会感觉很奇怪,这可以解释为什么这是一个如此受欢迎的问题和答案。 (2认同)

Eli*_*zer 25

如果要清晰地检查是否Boolean?true或者false你可以这样做:

when(b) {
    true -> {}
    false -> {}
}
Run Code Online (Sandbox Code Playgroud)

如果你想检查它null是否可以在(else)中添加(或)作为值when:

when(b) {
    true -> {}
    false -> {}
    null -> {}
}

when(b) {
    true -> {}
    false -> {}
    else-> {}
}
Run Code Online (Sandbox Code Playgroud)


Pio*_*zmo 22

Kotlin将静态分析您的空检查.这可以:

val b: Boolean? = null
if (b != null && b) {
    println(b)
}
Run Code Online (Sandbox Code Playgroud)

即使这失败了类型错误:

val b: Boolean? = null
if (b == null && b) {
    println(b)
}
Run Code Online (Sandbox Code Playgroud)

欲了解更多信息,请访问:http://kotlinlang.org/docs/reference/null-safety.html

您还可以使用"null coalescing operator"(这将适用于可变变量):

val b: Boolean? = null
if (b ?: false) {
    println(b)
}
Run Code Online (Sandbox Code Playgroud)


Dro*_*idT 6

从我所看到的布尔值?是方法的结果,该方法在可为空的对象上返回布尔值

val person: Person? = null
....
if(person?.isHome()) { //This won't compile because the result is Boolean?
  //Do something
}
Run Code Online (Sandbox Code Playgroud)

我一直在使用的解决方案是使用该let函数删除可能返回的null值,如下所示

person?.let {
  if(it.isHome()) {
    //Do something
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果将“ if”块替换为“ person?.isHome()== true”,则第一个编译。 (3认同)