使用布尔值?如果表达

时间:2015-09-28 20:05:46

标签: kotlin null

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

Boolean b = ...;
if (b != null && b) {
   /* Do something */
} else {
   /* Do something else */
}

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

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

然而,使用!!对我来说有点粗略,绕过了无效的安全系统。

对此有更优雅的方法吗?

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

enter image description here

10 个答案:

答案 0 :(得分:138)

您可以使用相等运算符将可空布尔值与truefalsenull进行比较:

var b: Boolean? = null
if (b == true) {
    // b was not null and equal true
}

答案 1 :(得分:21)

如果您想干净地检查Boolean?true还是false,您可以这样做:

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

如果您想检查它是null,可以将其添加(else)作为when中的值:

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

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

答案 2 :(得分:19)

Kotlin将静态分析您的空检查。这很好:

View Menu

即使失败并出现类型错误:

>>> s = Restaurant.objects.all()
>>> s[0].is_open()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/Users/xxx/myapp/models.py", line 64, in is_open
    return self.start_time <= datetime.datetime.now().time < self.end_time
TypeError: can't compare datetime.time to builtin_function_or_method

有关详情,请参阅:http://kotlinlang.org/docs/reference/null-safety.html

你也可以使用&#34; null coalescing operator&#34; (适用于可变变量):

val b: Boolean? = null
if (b != null && b) {
    println(b)
}

答案 3 :(得分:6)

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

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

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

person?.let {
  if(it.isHome()) {
    //Do something
  }
}

答案 4 :(得分:1)

对于Kotlin,我通常使用的是 if (object?.booleanProperty ==true) { //do stuff } 这仅在属性为true且对象不为null时才有效。反过来说: if (!object?booleanProperty !=true) { //do Stuff}

答案 5 :(得分:0)

在Kotlin,你可以这样做:

val b: Boolean? = true
if (b == true) { // if b is null, this should be null == true
    /* Do something */
} else {
    /* Do something else */
}

答案 6 :(得分:0)

让我们将 if-else 语句与Elvis Operator一起使用:

val a: Boolean?
val b: Boolean?

a = true
b = null

if (a != null ?: b) { 
    println("One of them isn't nullable...")
} else {
    println("Both are nullables!")
}
  

//结果:“其中一个不可为空...”

a = null
b = null

if (a != null ?: b) { 
    println("One of them isn't nullable...")
} else {
    println("Both are nullables!")
}
  

//结果:“两个都是空值!”

答案 7 :(得分:0)

添加扩展功能非常容易。

fun Boolean?.orDefault(default: Boolean = false): Boolean {
    if (this == null)
        return default
    return this
}

var x: Boolean? = null

if(x.orDefault()) {
..
}

答案 8 :(得分:0)

如果您要对contain执行类似的操作, String您可以使用如下所示的相等性检查-

if (url?.contains("xxx") == true){
  return false;
}

答案 9 :(得分:-1)

您可以使用安全的运算符“ let”

val b: Boolean? = null
b?.let { flag ->
    if(flag){
        // true Block
    } else {
        // false Block
    }
}