在Kotlin中,如果对象不是这样的,我可以运行代码:
data?.let {
... // execute this block if not null
}
但如果对象为null,我怎么能执行代码块呢?
答案 0 :(得分:76)
您可以使用elvis operator并使用run { ... }
评估另一段代码:
data?.let {
// execute this block if not null
} ?: run {
// execute this block if null
}
但这似乎不像简单的if
- else
声明那么可读。
此外,您可能会发现此Q& A很有用:
答案 1 :(得分:21)
您可以创建这样的中缀函数:
infix fun Any?.ifNull(block: () -> Unit) {
if (this == null) block()
}
然后你可以这样做:
data ifNull {
// Do something
}
答案 2 :(得分:11)
只需使用普通的if
:
if (data == null) {
// Do something
}
答案 3 :(得分:8)
以下是使用Elvis运算符的简洁语法。回想一下,Elvis运算符仅在左侧求值为空时才执行右侧。
data ?: doSomething()
答案 4 :(得分:1)
您可以使用以下代码
myNullable?.let {
} ?: {
// do something
}()
您还可以省略fun()
myNullable?.let {
} ?: fun() {
// do something
}()
或者您可以呼叫invoke()
而不是()
myNullable?.let {
} ?: fun() {
// do something
}.invoke()
请注意,返回值如下所示。
val res0 = myNullable?.let {
} ?: () {
}()
val res1 = myNullable?.let {
} ?: fun() {
"result"
}()
val res2 = myNullable?.let {
} ?: () {
"result"
}()
println("res0:$res0")
println("res1:$res1")
println("res2:$res2")
结果:
res0:kotlin.Unit // () {} with empty
res1:kotlin.Unit // fun() {}
res2:result // () {} with return
答案 5 :(得分:0)
我更喜欢这种解决方案,
fun runIfNull(any: Any?, block: () -> Unit) {
if (any == null) block()
}
您用作哪个:
runIfNull(any) { // it will run; }
与@Dmitry Ryadnenko的答案相比,它具有优势,
可能会让人困惑并且可能使用不正确的地方。
那里有一个功能
infix fun Any?.ifNull(block: () -> Unit) {
if (this == null) block()
}
如果您以下列方式在空对象上使用它:
nullObject?.ifNull { // THIS WILL NOT BE CALLED }
nullObject.ifNull { // this will be called }
该块将不被执行。
请注意错误添加的问号'?'
答案 6 :(得分:0)
let 也可以应用于 null,无论对象是否为 null:
data.let {d->
if (d != null){
// execute this block if data is not null
} else {
// for data is null
}
}
答案 7 :(得分:-1)
另一个好的选择是使用when
:
when(myVariable){
null -> {
// execute your null case here
}
else -> { // non null case }
}
when
用途广泛,因此您可以放置包括空值在内的确切条件。