如何习惯性地在Kotlin中调用可为空的Lambda?

时间:2018-08-07 18:49:53

标签: kotlin

给出以下lambda:

val lambda: () -> Unit = null

以下哪些调用对于Kotlin来说是空泛的,因为它调用了可为空的lambda?

lambda?.let { it() }

vs

lambda?.invoke()

3 个答案:

答案 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
}