Kotlin 接口上的 lambda 表达式 [英] lambda expression on interface in Kotlin

查看:25
本文介绍了Kotlin 接口上的 lambda 表达式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在将一个 Java 项目转换为 Kotlin,我很惊讶 Kotlin 中的接口使代码比 Java 中的代码更重.

I'm converting a project in Java to Kotlin and I'm surprise that interface made the code heavier in Kotlin than in Java.

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

Example: I want to set the onBackPressListener in MainActivity from MyFragment.

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

File 1: MainActivity, File 2: MyFragment, File 3: OnBackPressedListener (Interface)

Java 中的文件 1、Kotlin 中的文件 2、Java 中的文件 3:

File 1 in Java, File 2 in Kotlin, File 3 in Java:

activity.setOnBackPressed { /* Do something */ }

Kotlin 中的文件 1,Kotlin 中的文件 2,Java 中的文件 3:

File 1 in Kotlin, File 2 in Kotlin, File 3 in Java:

activity.setOnBackPressed(OnBackPressedListener { /* Do something */ })

Kotlin 中的文件 1、Kotlin 中的文件 2、Kotlin 中的文件 3:

File 1 in Kotlin, File 2 in Kotlin, File 3 in Kotlin:

activity.setOnBackPressed(object: OnBackPressedListener {
            override fun onBackPressed() {
                /* Do something */
            }
        })

是否可以在 Kotlin 中拥有 3 个文件并使用 lambda 来设置侦听器?(在 Kotlin 中获得更多代码真是令人沮丧..)

Is it possible to have the 3 files in Kotlin and use lambda to set the listener ? (This is so frustrating to get more code in Kotlin..)

谢谢

推荐答案

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

The lambda version works only when kotlin interop with java because SAM Conversions, see the official documents.

另请注意,此功能仅适用于 Java 互操作;自从科特林具有适当的函数类型,自动将函数转换为Kotlin 接口的实现是不必要的,因此不支持.

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 方法:

So if you want use lambda to set the listener with pure kotlin, you can define your listener and setOnBackPressed method like this:

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

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

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

then invoke it by:

listener?.invoke()

这篇关于Kotlin 接口上的 lambda 表达式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆