Kotlin 布尔函数的使用?在if表达式中

Kotlin 布尔函数的使用?在if表达式中,kotlin,null,Kotlin,Null,如果我有一个可空的布尔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 { /*

如果我有一个可空的
布尔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 */
}
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 
}
但是,使用
在我看来有点粗略,绕过了空安全系统

有没有更优雅的方法


看来我有点牵连过度了。如图所示,对于局部变量,它确实有效。然而,我的布尔值
b
实际上是一个“带有支持字段的属性”(我还没有真正了解这一点)。结果是:


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

val b: Boolean? = null
if (b != null && b) {
    println(b)
}
即使此操作失败并出现类型错误:

val b: Boolean? = null
if (b == null && b) {
    println(b)
}
有关更多信息,请参阅:

您还可以使用“空合并运算符”(适用于可变变量):


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

val b: Boolean? = ...
if (b != null && b!!) {
   /* Do something */
} else {
   /* Do something else */
}
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 
}

如果要清楚地检查
布尔值?
是否为
true
false
,可以执行以下操作:

when(b) {
    true -> {}
    false -> {}
}
如果要检查它是否为
null
,可以在
时将其(或
else
)作为值添加到
中:

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

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

从我看到的布尔值?是对可为null的对象返回布尔值的方法的结果

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 */
}
val b: Boolean? = true
if (b == true) { // if b is null, this should be null == true
    /* Do something */
} else {
    /* Do something else */
}

对于科特林,我通常使用的是

if (object?.booleanProperty ==true)
   { 
     //do stuff 
   }
只有当属性为true且对象不为null时,这才有效。反过来说:

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

在Kotlin中,您可以这样做:

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

//or

b.ifFalse {
   /* Do something else in false case */
}
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操作符

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!")
}
//结果:“其中一个不可为空…”

//结果:“两者都是可空的!”


如果有帮助的话,添加一个扩展函数是非常容易的

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

var x: Boolean? = null

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

您可以使用安全操作员“let”

如果您希望在一个计算机上执行类似的操作
contain
String
您可以使用如下等式检查-



为什么您需要
!!b
而不仅仅是
b
?(我对kotlin不太熟悉,只是好奇)@MarounMaroun,因为
b
可能是
null
,kotlin的一个特性是,在尝试计算可为null的引用时会出现编译错误。因此,使用纯
b
会产生编译错误:)但不会
b!=nil
在检查右侧之前捕获它?您可能会说确实如此,但我的IDE会说相反。我确实记得这样做应该有效,我会看看我是否能找到什么。我认为
val r=b?doSomething()?:doSomethingElse()
应该有效。分析只适用于不可变的值。如果您需要对可变字段执行此操作,请将其存储到临时局部变量。这确实是有意义的。空合并运算符可能就是我要找的。谢谢@Banthar不完全正确(您的第二个示例是
var
?)。。。如果它是本地
var
,那么编译器仍然可以允许安全强制转换。对于更特殊的情况,read-null coalescing elvis可以移动到assignment
val booleanVal=nullableProducer?.produceVal()?:false;if(booleanVal){}
if(b?:false){
谢谢!是的,在这种情况下:b.ifTrue{…}或b.ifFalse{…}可能有用注意:似乎不与逆运算符一起工作
@Richard认为b有三个可能值:
true
false
null
。然后在执行
if>时(b!=true)
你只知道b不是真的,但你对
false
null
eg2一无所知。
if(b!=true)//b为null或false
eg3。
if(b==false)//b为false
这是正确的答案,在Kotlin中很有意义,但是来自Java背景,在if语句中显式地比较true、false或null可能会感到奇怪,这可能解释了为什么这是一个如此流行的问题和答案。如果将
if
替换为
person?。isHome()==true
b!=null&&b==true
b==true
相同。这根本不是真的,将在抛出异常时返回。根据前面的注释编辑了我的答案