Ответ 1
Да, это правильно, если последний оператор лямбда является выражением, считается его возвращаемым значением.
Здесь что говорится в ссылке (спасибо @KirillRakhman):
Мы можем явно вернуть значение из лямбда, используя квалифицированный возврат. В противном случае значение последнего выражения будет принудительно возвращено. Поэтому два следующих фрагмента эквивалентны:
ints.filter { val shouldFilter = it > 0 shouldFilter }
ints.filter { val shouldFilter = it > 0 [email protected] shouldFilter }
Последняя семантика семантики также верна для if
(почему нет тройного оператора), when
и try
- catch
, и эти выражения сами являются выражениями:
val foo = if (bar) {
doSomething()
baz
} else {
doSomethingElse()
qux
}
См. также: примеры для when
и try
- catch
.
Итак, lambdas согласуются с языковыми конструкциями в этом отношении.
Если вы хотите сделать явный оператор return
в лямбда, используйте синтаксис [email protected]
(также, другой ответ с примерами). Не помеченный return
, напротив, работает с ближайшим fun
(игнорируя лямбда) и, следовательно, может произойти только в тех lambdas, которые inlined.
Было предложено предложение для добавления специального синтаксиса для испускания значения из кодового блока, но оно было отклонено.