如果我有一个可空的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 */
}
然而,使用!!
对我来说有点粗略,绕过了无效的安全系统。
对此有更优雅的方法吗?
编辑我似乎有点过分了。对于局部变量,如Banthar所示,它确实有效。但是,我的布尔b
实际上是一个“具有支持字段的属性”(我实际上并没有达到速度,但这实际上是什么)。这是结果:
答案 0 :(得分:138)
您可以使用相等运算符将可空布尔值与true
,false
或null
进行比较:
var b: Boolean? = null
if (b == true) {
// b was not null and equal true
}
答案 1 :(得分:21)
如果您想干净地检查Boolean?
是true
还是false
,您可以这样做:
when(b) {
true -> {}
false -> {}
}
如果您想检查它是null
,可以将其添加(else
)作为when
中的值:
when(b) {
true -> {}
false -> {}
null -> {}
}
when(b) {
true -> {}
false -> {}
else-> {}
}
答案 2 :(得分:19)
Kotlin将静态分析您的空检查。这很好:
View Menu
即使失败并出现类型错误:
>>> s = Restaurant.objects.all()
>>> s[0].is_open()
Traceback (most recent call last):
File "<console>", line 1, in <module>
File "/Users/xxx/myapp/models.py", line 64, in is_open
return self.start_time <= datetime.datetime.now().time < self.end_time
TypeError: can't compare datetime.time to builtin_function_or_method
有关详情,请参阅:http://kotlinlang.org/docs/reference/null-safety.html
你也可以使用&#34; null coalescing operator&#34; (适用于可变变量):
val b: Boolean? = null
if (b != null && b) {
println(b)
}
答案 3 :(得分:6)
从我看过的布尔?是一个方法的结果,该方法在可以为空的对象上返回布尔值
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
}
}
答案 4 :(得分:1)
对于Kotlin,我通常使用的是
if (object?.booleanProperty ==true)
{ //do stuff }
这仅在属性为true且对象不为null时才有效。反过来说:
if (!object?booleanProperty !=true)
{ //do Stuff}
答案 5 :(得分:0)
在Kotlin,你可以这样做:
val b: Boolean? = true
if (b == true) { // if b is null, this should be null == true
/* Do something */
} else {
/* Do something else */
}
答案 6 :(得分:0)
让我们将 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!")
}
//结果:“两个都是空值!”
答案 7 :(得分:0)
添加扩展功能非常容易。
fun Boolean?.orDefault(default: Boolean = false): Boolean {
if (this == null)
return default
return this
}
var x: Boolean? = null
if(x.orDefault()) {
..
}
答案 8 :(得分:0)
如果您要对
contain
执行类似的操作,String
您可以使用如下所示的相等性检查-
if (url?.contains("xxx") == true){
return false;
}
答案 9 :(得分:-1)
您可以使用安全的运算符“ let”
val b: Boolean? = null
b?.let { flag ->
if(flag){
// true Block
} else {
// false Block
}
}