Is there a way to get the value of the expression I passed into the when statement?

In my application I have a KeyListener like that

_content.addKeyListener(object : KeyAdapter() {
    override fun keyPressed(e: KeyEvent?) = when(e?.keyCode) {
        KeyEvent.VK_T -> mainWindow.enterTrainingState()
        KeyEvent.VK_P -> mainWindow.enterPlayState()
        KeyEvent.VK_E -> mainWindow.close()
        else -> println(e?.keyCode)
    }
})

Kotlin有一个简洁的语法来访问e?.keyCode吗?我真的不想重复这个表达.

推荐答案

I had this problem myself a couple of days ago. I think it would have been nice to be able to access the value as it inside the when-expression.

I solved it by assigning the expression to a val before the when expression:

val keyCode = e?.keyCode
when(keyCode) {
    KeyEvent.VK_T -> mainWindow.enterTrainingState()
    KeyEvent.VK_P -> mainWindow.enterPlayState()
    KeyEvent.VK_E -> mainWindow.close()
    else -> println(keyCode)
}

不幸的是,这将需要您添加额外的花括号和线条.不过,好的一面是,e?.keyCode只会被判断一次.在这种情况下,这可能无关紧要,但如果表达式更大,则此方法将是合适的.

Edit:

另一种可能是将when表达式包装在对let的调用中.它允许您使用it访问参数.如下所示:

e?.keyCode.let {
    when(it) {
        KeyEvent.VK_T -> mainWindow.enterTrainingState()
        KeyEvent.VK_P -> mainWindow.enterPlayState()
        KeyEvent.VK_E -> mainWindow.close()
        else -> println(it)
  }
}

Edit2:

Kotlin 1.3 has support for capturing the subject expression of a when in a variable. This is the syntax:

when(val keyCode = e?.keyCode) {
    KeyEvent.VK_T -> mainWindow.enterTrainingState()
    KeyEvent.VK_P -> mainWindow.enterPlayState()
    KeyEvent.VK_E -> mainWindow.close()
    else -> println(keyCode)
}

Kotlin相关问答推荐

如何为集成测试配置Gradle JVM测试套件?

Kotlin 海峡没有结束

如何让Gradle8+在编译Kotlin代码之前编译Groovy代码?然后把它们混合在一个项目中?

始终抛出的函数 - 具有块主体的函数中需要的返回表达式

Kotlin 可空泛型

按钮无法在 Android Studio 上打开新活动

Kotlin:使用另一个列表和字母顺序对列表进行排序的有效方法

在 Kotlin 中,如何绑定扩展方法以在接收器范围函数中工作

如何在 kotlin 中创建自定义迭代器并添加到现有类?

将 SharedPreferences 中的值公开为流

通过顺序多米诺骨牌操作列表管理对象的最佳方法是什么?

如何在 Kotlin 中为变量分配另一个变量的值?

找不到引用的类 kotlin.internal.annotations.AvoidUninitializedObjectCopyingCheck

内联函数导致单元测试代码覆盖率报告出错

Spring webflux bean验证不起作用

如何在 android jetpack compose 中相互重叠列表项?

零安全的好处

如何让数据类在Kotlin中实现接口/扩展超类属性?

你如何在 Kotlin 中注释 Pair 参数?

带有注释为@RegisterExtension的字段的 JUnit 5 测试在 Kotlin 中不起作用