Неявный возврат из лямбда в Котлине

Кажется, что последняя строка лямбда всегда возвращает это значение, даже если вы опускаете оператор return . Это верно? Документировано ли это где угодно?

 fun main(args: Array<String>) { val nums = arrayOf(1, 2, 3) val numsPlusOne = nums.map { it -> val r = it + 1 r } // numsPlusOne = [2, 3, 4] } 

Да, это правильно, если последний оператор лямбда является выражением, он считается его возвращаемым значением.

Вот что говорит ссылка (спасибо @KirillRakhman ):

Мы можем явно вернуть значение из лямбда с использованием квалифицированного синтаксиса возврата . В противном случае значение последнего выражения будет принудительно возвращено. Поэтому два следующих фрагмента эквивалентны:

 ints.filter { val shouldFilter = it > 0 shouldFilter } 

 ints.filter { val shouldFilter = it > 0 return@filter shouldFilter } 

Последняя семантика оператора также верна для if (поэтому нет тройного оператора) , when и блоки try catch , и эти выражения сами являются выражениями:

 val foo = if (bar) { doSomething() baz } else { doSomethingElse() qux } 

Смотрите также: примеры для того, when и try catch .

Итак, лямбда согласуется с языковыми конструкциями в этом отношении.


Если вы хотите сделать явный оператор return в лямбда, используйте синтаксис return@label (также, еще один ответ с примерами ). Немаркированное return , напротив, работает с ближайшим fun (игнорируя лямбда) и, таким образом, может происходить только в тех лямбдах, которые являются встроенными .

Было предложено языковое предложение для добавления специального синтаксиса для испускания значения из кодового блока, но оно было отклонено.