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

半神

请说明一个用例以及每种方法的利弊。

  1. 使用界面。

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

    fun doSomethingWithCallback(callback: () -> Unit) {
        // Do something
        callback()
    }
    
吉文贝格

选项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。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

从回调列表中删除侦听器的最优雅方法是什么

ObservableOnSubscribe 回调中侦听器的生命周期是什么 - Rxjava

Java:awt侦听器中的抽象方法是否称为回调方法?

在回调侦听器中设置imageview位图

断言在JUnit中调用了回调/侦听器

Android侦听器/回调如何?

Kotlin 中的回调是什么?

查找在浏览器中调试JavaScript的侦听器的最快方法是什么?

对动作侦听器进行编程的常用方法是什么?

代替引用一个对象的许多事件侦听器和函数,还有什么更好的方法?

Java中的侦听器的目的是什么?

Reactor中侦听器的主题是什么?

在Firebase Cloud数据库中设置值侦听器的正确方法是什么?

创建发出侦听器回调结果的Kotlin协程Deferred对象

回调异常[TypeError:侦听器必须是一个函数]

如何将事件侦听器回调设置为成员函数

将元素传递给事件侦听器回调函数

事件侦听器回调不会通过常规函数调用触发

从主程序访问事件侦听器回调函数的返回值?

如果回调是参数化箭头函数,如何删除事件侦听器

NodeJS-如何使用函数设置侦听器回调?

有什么方法可以访问在函数中添加了事件侦听器的元素?

将嵌套的发射器变量传递到事件侦听器的回调中

如何禁用JPA 2回调方法和实体侦听器

如何从传递给侦听器的回调中访问状态挂钩值?

是否可以在nodejs中的“ newListener”事件的事件侦听器回调中发出事件?

在点击侦听器回调中获取活动上下文

在事件侦听器回调中未调用Restify res.send()

Dojo:在事件侦听器回调中维护对窗口小部件的引用