Kotlin 中更好的回调方法是什么?侦听器与高阶函数

Dem*_*god 12 android kotlin

请解释每种方法的用例和优缺点。

  1. 接口的使用。

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

    fun doSomethingWithCallback(callback: () -> Unit) {
        // Do something
        callback()
    }
    
    Run Code Online (Sandbox Code Playgroud)

jiv*_*erg 9

选项1

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

doSomethingWithCallback1 { print("helloWorld") }
Run Code Online (Sandbox Code Playgroud)

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

void doSomethingWithJavaCallback(JavaCallback callback) {
    // Do something
    callback.call();
}
Run Code Online (Sandbox Code Playgroud)

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

选项 2

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

选项 3

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

typealias Callback = () -> Unit

fun doSomethingWithCallback5(callback: Callback) {
    // Do something
    callback()
}
Run Code Online (Sandbox Code Playgroud)

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