如果可空类型为空,我如何 运行 一段代码?
How do I run a block of code if a nullable type is null?
在 Kotlin 中,如果对象不为 null,我可以像这样 运行 编码:
data?.let {
// execute this block if not null
}
但是如果对象为空,我如何执行一段代码?
使用普通的if
:
if (data == null) {
// Do something
}
您可以使用 elvis operator 并使用 run { ... }
评估另一个代码块:
data?.let {
// execute this block if not null
} ?: run {
// execute this block if null
}
但这似乎不如简单的 if
-else
语句可读。
此外,您可能会发现此问答很有用:
您可以像这样创建一个中缀函数:
infix fun Any?.ifNull(block: () -> Unit) {
if (this == null) block()
}
那么你可以这样做:
data ifNull {
// Do something
}
这是使用 Elvis 运算符的简明语法。回想一下,Elvis 运算符仅在左侧计算结果为 null 时才执行右侧。
data ?: doSomething()
您可以使用下面的代码
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
我更喜欢这个解决方案,
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 }
块不会被执行。
请注意错误添加的问号'?'
let 也可以应用于 null,无论对象是否为 null:
data.let {d->
if (d != null){
// execute this block if data is not null
} else {
// for data is null
}
}
以下答案是 答案的简单版本。
函数 returns 如果链调用成功则有效列表
其他
returnsemptyList()
class A(var b: B? = null)
class B(var c: C? = null)
class C(var d: D? = null)
class D(var list: List<String>?)
//1. Note ? in A?.<functionName>
fun A?.isNull(): List<String> {
if(this == null) { // 2. access object using this keyword
return emptyList<String>()
}
return this.b?.c?.d?.list ?: emptyList<String>()
}
fun main() {
//1. Empty A object
var a: A? = A()
println(a.isNull()) //[]
//2. Null A object
a = null
println(a.isNull()) //[]
//3. All Valid chaining parameters
val d = D(listOf("d"))
val c = C(d)
var b : B? = B(c)
a = A(b)
println(a.isNull()) //[d]
//4. Invalid chain parameter
b = null
a = A(b)
println(a.isNull()) //[]
}
在 Kotlin 中,如果对象不为 null,我可以像这样 运行 编码:
data?.let {
// execute this block if not null
}
但是如果对象为空,我如何执行一段代码?
使用普通的if
:
if (data == null) {
// Do something
}
您可以使用 elvis operator 并使用 run { ... }
评估另一个代码块:
data?.let {
// execute this block if not null
} ?: run {
// execute this block if null
}
但这似乎不如简单的 if
-else
语句可读。
此外,您可能会发现此问答很有用:
您可以像这样创建一个中缀函数:
infix fun Any?.ifNull(block: () -> Unit) {
if (this == null) block()
}
那么你可以这样做:
data ifNull {
// Do something
}
这是使用 Elvis 运算符的简明语法。回想一下,Elvis 运算符仅在左侧计算结果为 null 时才执行右侧。
data ?: doSomething()
您可以使用下面的代码
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
我更喜欢这个解决方案,
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 }
块不会被执行。
请注意错误添加的问号'?'
let 也可以应用于 null,无论对象是否为 null:
data.let {d->
if (d != null){
// execute this block if data is not null
} else {
// for data is null
}
}
以下答案是
函数 returns 如果链调用成功则有效列表
其他
returnsemptyList()
class A(var b: B? = null)
class B(var c: C? = null)
class C(var d: D? = null)
class D(var list: List<String>?)
//1. Note ? in A?.<functionName>
fun A?.isNull(): List<String> {
if(this == null) { // 2. access object using this keyword
return emptyList<String>()
}
return this.b?.c?.d?.list ?: emptyList<String>()
}
fun main() {
//1. Empty A object
var a: A? = A()
println(a.isNull()) //[]
//2. Null A object
a = null
println(a.isNull()) //[]
//3. All Valid chaining parameters
val d = D(listOf("d"))
val c = C(d)
var b : B? = B(c)
a = A(b)
println(a.isNull()) //[d]
//4. Invalid chain parameter
b = null
a = A(b)
println(a.isNull()) //[]
}