什么是Kotlin回调的更好方法?监听器与高阶功能

时间:2018-05-25 12:25:39

标签: android kotlin

请解释每种方法的用例和利弊。

  1. 使用界面。

    fun doSomethingWithCallback(callback: Callback) {
        // Do something
        callback.call()
    }
    
  2. 使用高阶函数。

    fun doSomethingWithCallback(callback: () -> Unit) {
        // Do something
        callback()
    }
    

2 个答案:

答案 0 :(得分:1)

选项1

使用选项1 ,您无法通过lambda调用它。例如,这不编译:

doSomethingWithCallback1 { print("helloWorld") }

有趣的是,如果在Java中定义了相同的方法:

void doSomethingWithJavaCallback(JavaCallback callback) {
    // Do something
    callback.call();
}

然后你可以使用Kotlin的lambda 来调用它。这是因为Kotlin只对Java中定义的函数进行SAM转换。

选项2

相比之下,如果你选择选项2 ,你可以使用lambda来调用它。从Kotlin和Java调用它时它都可以工作。

选项3

正如评论中所提到的,第三个选项正在使用这样的类型别名:

typealias Callback = () -> Unit

fun doSomethingWithCallback5(callback: Callback) {
    // Do something
    callback()
}

您可以将函数签名中的类型保留在调用站点上使用lambdas。

答案 1 :(得分:0)

  1. 您可以使用lambda:

    doSomethingWithCallback { // do whatever you want }

  2. 我通常使用lambda函数:

    var doSomething: (Any) -> Unit)? = null

    doSomething?.invoke(any)

    最后和听众一样:

    yourvarclass.doSomething = { any -> // this is callback }