java - Kotlin 接口上的 lambda 表达式
问题描述
我正在将 Java 中的项目转换为 Kotlin,令我惊讶的是,接口使 Kotlin 中的代码比 Java 中的代码更重。
示例:我想在 MyFragment 的 MainActivity 中设置 onBackPressListener。
文件 1:MainActivity,文件 2:MyFragment,文件 3:OnBackPressedListener(接口)
Java 中的文件 1、Kotlin 中的文件 2、Java 中的文件 3:
activity.setOnBackPressed { /* Do something */ }
Kotlin 中的文件 1,Kotlin 中的文件 2,Java 中的文件 3:
activity.setOnBackPressed(OnBackPressedListener { /* Do something */ })
Kotlin 中的文件 1,Kotlin 中的文件 2,Kotlin 中的文件 3:
activity.setOnBackPressed(object: OnBackPressedListener {
override fun onBackPressed() {
/* Do something */
}
})
是否可以在 Kotlin 中有 3 个文件并使用 lambda 设置监听器?(在 Kotlin 中获得更多代码真是令人沮丧..)
谢谢
解决方案
lambda 版本仅在 kotlin 与 java 互操作时有效,因为SAM Conversions
,请参阅官方文档。
另请注意,此功能仅适用于 Java 互操作;由于 Kotlin 具有适当的函数类型,因此不需要将函数自动转换为 Kotlin 接口的实现,因此不受支持。
所以如果你想使用 lambda 来设置纯 kotlin 的监听器,你可以像这样定义你的listener
andsetOnBackPressed
方法:
var listener: (() -> Unit)? = null
fun setOnBackPressed(l: () -> Unit) {
listener = l
}
然后通过以下方式调用它:
listener?.invoke()
推荐阅读
- matplotlib - matplotlib 交互式导航键盘快捷键如何工作?
- matlab - 有没有办法在 MATLAB App Designer UIAxes 中显示箱线图?
- pine-script - 如何将 pinescript 从 v2 转换为 v4?
- ios - Swift:如何将 JSON 编写为结构?
- c# - .net 核心是否仍应抛出 System.ExecutionEngineException?
- sql - 如何在 SQL 过程中使用多个表类型参数来过滤数据?
- google-cloud-firestore - Firebase中的覆盖与合并差异
- corda - IntelliJ/Kotlin 升级导致“不兼容的类型”错误?
- javascript - 尝试使用.splice 删除 JavaScript 中的重复项
- python - 在 Pandas 中结合工作日和小时