使用布尔值?在 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)
}
您可以使用相等运算符将可空布尔值与 true
、false
或 null
进行比较:
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()
如果我有一个可为空的 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)
}
您可以使用相等运算符将可空布尔值与 true
、false
或 null
进行比较:
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 aString
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()