给出以下lambda:
val lambda: () -> Unit = null
以下哪些调用对于Kotlin来说是空泛的,因为它调用了可为空的lambda?
lambda?.let { it() }
vs
lambda?.invoke()
答案 0 :(得分:4)
让我们问一下Kotlin编译器:
val lambda: (() -> Unit)? = null
lambda()
编译器说:
Reference has a nullable type '(() -> Unit)?', use explicit '?.invoke()' to make a function-like call instead
是的,似乎?.invoke()
是可行的方式。
尽管这对我(以及编译器)来说似乎也不错:
if (lambda != null) {
lambda()
}
答案 1 :(得分:0)
这是一个简单的例子:
fun takeThatFunction(nullableFun: (() -> Unit)?) {
nullableFun?.let { it() }
}
takeThatFunction { print("yo!") }
答案 2 :(得分:0)
这种情况下的别名可能是一种更具表现力的方法
typealias TheNameOFYourCallback = ()-> Unit
class Something {
private var callback: TheNameOFYourCallback? = null
fun setTheCallback(callback: TheNameOFYourCallback) {
this.callback = callback
}
private fun usageOfCallback() {
callack?.invoke()
}
}
然后使用
val something = Something()
something.setTheCallback {
//Do your thing
}
当然,var
可能不是private
,但是通过这种方式设置回调可以利用lambda的语法糖来实现方法,否则,赋值形式对我来说似乎很奇怪,自行判断:
something.callback = {
//Do your thing
}