如何将其转换为lambda?

时间:2019-08-02 04:35:29

标签: android kotlin

Android Studio弯弯曲曲地说我应该/可以将其转换为lambda。我只是回到我的Android。

popup.setOnMenuItemClickListener(object : PopupMenu.OnMenuItemClickListener {
    override fun onMenuItemClick(item: MenuItem): Boolean {
        if (item.itemId === R.id.action_vitals) {
            val vitalsIntent = Intent(this@DashboardActivity, VitalsActivity::class.java)
            vitalsIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
            startActivity(vitalsIntent)
        }
        if (item.itemId === R.id.action_devices) {
            val devicesIntent = Intent(this@DashboardActivity, DevicesActivity::class.java)
            devicesIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
            startActivity(devicesIntent)
        }
        return false
    }
})

这是弯曲的“对象:PopupMenu.OnMenuItemClickListener”

2 个答案:

答案 0 :(得分:2)

有一些评论和答案建议在IntelliJ / Android Studio中使用alt + enter,这将为您处理将代码转换为Lambda的问题。但是,可能值得介绍它为什么向您建议。

lambda是未声明的函数,例如fun someFunction(),但立即将其作为参数传递给另一个函数。然后,该lambda将由应用程序中其他位置的其他一些代码执行。 Lambda本质上是一种简写函数,例如:

val lambda: () -> Unit = {
    // Some code could go inside this Lambda here    
}

对于您来说,一个重要的概念是SAM(单一抽象方法)类型。这仅是指定义需要实现的单个抽象功能的接口。在您的示例中,PopupMenu.OnMenuItemClickListener是一个具有单个抽象方法void onMenuItemClick(MenuItem item)的Java接口。 SAM类型可以用简写形式编写,而lambda的主体将成为抽象函数的主体。

您已正确将此代码编写为匿名对象,这很好;但可以使用Android Studio建议的lambda来更简洁地编写。在Kotlin中,另一个有用的提示是,如果某个函数或lambda是参数列表中的唯一或最终参数,则可以将其移出该函数的括号之外,或者将其完全删除。

因此您的代码将被转换为如下形式:

    enterpopup.setOnMenuItemClickListener {
        if (item.itemId === R.id.action_vitals) {
                val vitalsIntent = Intent(this@DashboardActivity, VitalsActivity::class.java)
                vitalsIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
                startActivity(vitalsIntent)
            }
            if (item.itemId === R.id.action_devices) {
                val devicesIntent = Intent(this@DashboardActivity, DevicesActivity::class.java)
                devicesIntent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
                startActivity(devicesIntent)
            }
            return false
    }

答案 1 :(得分:1)

您可以使用 Alt + Enter 显示“建议”列表(在JetBrains语言中称为检查)。选择建议将自动为您执行转换。

IntelliJ 2019.2对该功能进行了改进(应该很快会出现在Android Studio中),显示有关最佳建议的更多信息并添加 Alt + Shift + < kbd>输入作为直接应用它的快捷方式(绕过列表) https://www.jetbrains.com/idea/whatsnew/#v2019-2

enter image description here