使用布尔值?在 if 表达式中

Use of Boolean? in if expression

如果我有一个可为空的 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 */
}

但是,!! 的使用对我来说感觉有点粗略,绕过了空安全系统。

是否有更优雅的方法?


编辑 看来我有点过于简单化了。对于局部变量,如 所示,它确实有效。但是,我的布尔值 b 实际上是一个 "property with a backing field" (我还没有真正跟上它的速度)。这是结果:

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

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

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

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

更多请看:http://kotlinlang.org/docs/reference/null-safety.html

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

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

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

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 
}

如果你想清楚地检查 Boolean?true 还是 false 你可以这样做:

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

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

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

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

据我所见,布尔值?是 returns 对象上的布尔值方法的结果,该对象可为空

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

我一直在使用的解决方案是使用let函数来删除可能返回的空值,就像这样

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

首先,添加下面的自定义内联函数:

inline fun Boolean?.ifTrue(block: Boolean.() -> Unit): Boolean? {
    if (this == true) {
        block()
    }
    return this
}

inline fun Boolean?.ifFalse(block: Boolean?.() -> Unit): Boolean? {
    if (null == this || !this) {
        block()
    }

    return this
}

那么你可以这样写代码:

val b: Boolean? = ...
b.ifTrue {
   /* Do something in true case */
}

//or

b.ifFalse {
   /* Do something else in false case */
}

对于 Kotlin,我通常使用的是

if (object?.booleanProperty ==true)
   { 
     //do stuff 
   }

这仅在 属性 为真且对象不为空时有效。反过来:

if (!object?booleanProperty !=true)
   { 
     //do Stuff
   }

在 Kotlin 中,你可以这样做:

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

让我们使用 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!")
}

// Result: "One of them isn't nullable..."

a = null
b = null

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

// Result: "Both are nullables!"

如果对您有帮助,添加扩展功能非常简单。

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

var x: Boolean? = null

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

你可以用 safe Operator "let"

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

In case if you want to perform operations alike contain on a String you could use equality check like below -

if (url?.contains("xxx") == true){
  return false;
}
myBoolean?.let {
    if(it) -> doSomething()
}

myBoolean?.let {
    if(it) -> {
        doSomething()
    } else {
        doSomethingElse()
    }
}

您还可以选择在 myBoolean 为 null 的情况下执行某些操作,如下所示:

myBoolean?.let {
    if(it) -> doSomething()
} ?: doSomethingInCaseOfNull()