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可以移动到assignmentval 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
相同。这根本不是真的,将在抛出异常时返回。根据前面的注释编辑了我的答案