在Kotlin中使用传递给分支条件的参数?

我有一些代码大致看起来像这样:

val myObject = myObjectRepository.findById(myObjectId); when { matchesSomething(myObject) -> doSomethingWithMyObject(myObject) matchesSomethingElse(myObject) -> doSomethingElseWithMyObject(myObject) else -> log.warn("No match, aborting"); } 

虽然这个工程,我会认为,以下(这是行不通的)将是一个改进,如果我只需要访问myObject范围内的when

 when(myObjectRepository.findById(myObjectId)) { myObject -> matchesSomething(myObject) -> doSomethingWithMyObject(myObject) matchesSomethingElse(myObject) -> doSomethingElseWithMyObject(myObject) else -> log.warn("No match, aborting"); } 

我在这里得到的错误是:

未解决的参考:myObject

你能在Kotlin做这样的事吗?如果是的话,怎么样? 如果不是的话,为什么不应该允许这个原因呢?

如文档中所示,正确的语法是

 val myObject = myObjectRepository.findById(myObjectId); when { matchesSomething(myObject) -> doSomethingWithMyObject(myObject) matchesSomethingElse(myObject) -> doSomethingElseWithMyObject(myObject) else -> log.warn("myObject not found, aborting") } 

或者,要真正匹配你的第一个片段:

 val myObject = myObjectRepository.findById(myObjectId); when(myObject) { null -> log.warn("myObject not found, aborting"); matchesSomething(myObject) -> doSomethingWithMyObject(myObject) matchesSomethingElse(myObject) -> doSomethingElseWithMyObject(myObject) } 

你必须小心语法。 在一段while我们使用箭头->这与lambda无关。 我想这是你在你的例子中尝试的。

这是when唯一有效的语法:

 when (x) { 1 -> print("x == 1") 2 -> print("x == 2") else -> { // Note the block print("x is neither 1 nor 2") } 

在箭头的左侧->您声明对象(x)正在匹配什么 ,而在右侧则说明在这种情况下将执行什么操作。 阅读这里 。

在你的例子中,你尝试链多个->哪个不工作。