android - Kotlin 中更好的回调方法是什么?侦听器与高阶函数
问题描述
请解释每种方法的用例和优缺点。
接口的使用。
fun doSomethingWithCallback(callback: Callback) { // Do something callback.call() }
使用高阶函数。
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。
推荐阅读
- ios - 如何在不拖放的情况下将 tableview 控制器中的 tableview 行重新排序到指定的索引行?
- assembly - 汇编 - 访问浮点数组的第一个索引返回 0
- c# - 不区分大小写的重音devexpress过滤器gridview c#
- python - Python基础——方括号
- c++ - 二叉树的右视图
- java - 如何使用 Postman 中的 JSON 将值存储在特定列中(值由下划线分隔)
- python - 加载模型时没有 GPU 的机器上的 Cuda 驱动程序错误
- python - 在 python 中使用神经网络进行主因子分析
- r - R闪亮有没有办法连接输入所采用的所有值
- django - django 从其他 python 脚本上传文件