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

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

Ответ 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.

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