首页 > 解决方案 > Kotlin 中更好的回调方法是什么?侦听器与高阶函数

问题描述

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

  1. 接口的使用。

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

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

标签: androidkotlin

解决方案


选项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()
}

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


推荐阅读