在 if 表达式中使用 Boolean

如果我有一个可为空的 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实际上是一个“带有后备字段的属性”(我还没有真正了解它所带来的影响)。这就是结果:

enter image description here

113905 次浏览

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 合并运算符”(它将适用于可变变量) :

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,你可以在 when中添加 null(或 else)作为值:

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


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

从我看到的布尔函数来看?是在可为空的对象上返回布尔值的方法的结果

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
}
}

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

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
}

只有当属性为 true 且对象不为 null 时,这个函数才会工作。相反:

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!")
}

//结果: “其中一个是不可取消的...”

a = null
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()) {
..
}

您可以做的安全,操作员“让”

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

如果希望在 你可以像下面这样使用相等检查

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()
val b: Boolean? = null


if(b == true ?: false) {
//some action
}