首页 文章

什么是Kotlin回调的更好方法?监听器与高阶函数[关闭]

提问于
浏览
2

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

  • 使用界面 .
fun doSomethingWithCallback(callback: Callback) {
    // Do something
    callback.call()
}
  • 使用高阶函数 .
fun doSomethingWithCallback(callback: () -> Unit) {
    // Do something
    callback()
}

2 回答

  • 1

    选项1

    使用 option 1 ,你无法通过lambda调用它 . 例如,这不编译:

    doSomethingWithCallback1 { print("helloWorld") }
    

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

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

    然后 you can call it using a lambda 来自Kotlin . 这是因为Kotlin只对Java中定义的函数进行SAM转换 .

    选项2

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

    选项3

    正如评论中所提到的, third option 正在使用这样的类型别名:

    typealias Callback = () -> Unit
    
    fun doSomethingWithCallback5(callback: Callback) {
        // Do something
        callback()
    }
    

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

  • 0
    • 您可以使用lambda:

    doSomethingWithCallback { // do whatever you want }

    • 我通常使用lambda函数:

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

    和:

    doSomething?.invoke(any)

    最后和听众一样:

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

相关问题