在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)正在匹配什么 ,而在右侧则说明在这种情况下将执行什么操作。 阅读这里 。
在你的例子中,你尝试链多个->
哪个不工作。