Kotlin界面上的lambda表达式

时间:2018-06-14 10:21:42

标签: java android lambda interface kotlin

我将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中获取更多代码真令人沮丧......)

由于

2 个答案:

答案 0 :(得分:5)

使用Kotlin =)时使用Java风格

如果您真的想使用OnBackPressedListener,可以将其包装在inline函数中,例如:

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

然后只设置监听器

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

答案 1 :(得分:5)

lambda版本仅在kotlin与java互操作时才有效,因为SAM Conversions,请参阅the official documents

  

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

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

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

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

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

listener?.invoke()