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 ,请参阅官方文档 。

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

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

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

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

 listener?.invoke() 

使用Kotlin =时使用Java风格

如果你真的想使用OnBackPressedListener你可以将它包装OnBackPressedListener inline函数中,如:

 inline fun backPress(crossinline action:()->Unit):OnBackPressedListener { return object: OnBackPressedListener { override fun onBackPressed() { action() } } } 

然后只需设置监听器

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