Использовать аргумент, переданный, когда в состоянии филиала в Котлин?

У меня есть код, который выглядит примерно так:

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

Можете ли вы сделать что-то подобное в Котлине, и если да, то как? Если нет, есть ли конкретная причина, почему это не должно быть разрешено?

Как показано в документации , правильный синтаксис будет

 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 мы используем стрелку -> которая не имеет ничего общего с лямбдами. Я думаю, это то, что вы пытались в своем примере.

Единственный допустимый синтаксис для этого:

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

В левой части стрелки -> вы указываете, с чем сопоставляется объект (x), тогда как с правой стороны вы указываете, что будет выполнено в этом случае. Читайте об этом здесь .

В вашем примере вы попытались связать несколько -> которые не работают.