首页 > 解决方案 > 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 中获得更多代码真是令人沮丧..)

谢谢

标签: javaandroidlambdainterfacekotlin

解决方案


lambda 版本仅在 kotlin 与 java 互操作时有效,因为SAM Conversions,请参阅官方文档

另请注意,此功能仅适用于 Java 互操作;由于 Kotlin 具有适当的函数类型,因此不需要将函数自动转换为 Kotlin 接口的实现,因此不受支持。

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

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

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

然后通过以下方式调用它:

listener?.invoke()

推荐阅读