【问题标题】:How can I turn this into a lambda?我怎样才能把它变成一个 lambda?
【发布时间】:2019-08-02 17:10:45
【问题描述】:

Android 工作室给我一个曲折的说法,我应该/可以把它变成一个 lambda。我刚刚回到我的安卓系统。

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”

【问题讨论】:

  • Alt+Enter,它会帮你搞定的。
  • 这看起来也很重要,可以转换为when
  • 不知道如果没有建议,我可以使用 Alt+Enter。谢谢你!!!

标签: android kotlin


【解决方案1】:

有几个 cmets 和答案建议在 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 工作室建议的 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
    }

【讨论】:

  • 一个可能并不明显的奇怪之处:如果您在 Kotlin(而不是 Java)中声明 SAM 接口,则不能替换 lambda! Kotlin(目前)只允许用 lambda 代替 Java SAM。
【解决方案2】:

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

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

【讨论】:

  • 感谢您的信息。但是,我使用的是 Android Studio 3。
  • @Gary Vaughan - Android Studio 基于 IntelliJ 平台构建。您已经可以使用Alt+Enter(我相信它一直是 AS 的一部分)。新的Alt+Shift+Enter 应该出现在 AS 3.6 或 3.7 中(当它们更新以与主要的 IntelliJ 框架重新对齐时)。
  • @Gary Vaughan - 根据发行说明,AS 3.6(目前为 Canary/preview)确实是基于 2019.2 构建的:developer.android.com/studio/preview/features/#idea-2019-2
猜你喜欢
  • 1970-01-01
  • 2014-01-28
  • 1970-01-01
  • 2020-11-06
  • 2018-03-26
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
  • 2017-11-14
相关资源
最近更新 更多