java - Kotlin 接口(interface)上的 lambda 表达式

标签 java android lambda interface kotlin

我正在将 Java 中的项目转换为 Kotlin,我很惊讶接口(interface)使 Kotlin 中的代码比 Java 中的代码更重。

示例: 我想在 MyFragment 的 MainActivity 中设置 onBackPressListener。

文件 1:MainActivity,文件 2:MyFragment,文件 3:OnBackPressedListener(接口(interface))

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 转换,请参阅 the official documents .

Also note that this feature works only for Java interop; since Kotlin has proper function types, automatic conversion of functions into implementations of Kotlin interfaces is unnecessary and therefore unsupported.

所以如果你想使用 lambda 来设置纯 kotlin 的监听器,你可以像这样定义你的 listenersetOnBackPressed 方法:

var listener: (() -> Unit)? = null

fun setOnBackPressed(l: () -> Unit) {
    listener = l
}

然后调用它:

listener?.invoke()

关于java - Kotlin 接口(interface)上的 lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50855192/

相关文章:

java - 如何在java中用新值更新绘制的矩形

java - TextView 在相对布局中不显示全文

android - 不会被杀死的长时间运行的后台任务

java - 使用高版本javac编译的jar库

java - 需要专门获取 java-1.8.0-openjdk-amd64 并安装?

java - 使用 gradle 进行多项目依赖管理

android - adb shell 我开始给出 ClassNotFoundException

asp.net-mvc - 带有 lambda 表达式的 ASP.net MVC 操作 URL

C++11 将 shared_ptr 转换为 vector 和类

java - ajc 不会将 lambda 编译为 vararg 参数