Использование возврата внутри лямбда?

В приведенном ниже коде я хочу показать свои пустые представления, если поездки пусты, а затем вернуться и не запускать приведенный ниже код, но компилятор говорит, что "возврат здесь не разрешен".

mainRepo.fetchUpcomingTrips { trips ->
    if (trips.isEmpty()) {
        showEmptyViews()
        return
    }

    // run some code if it not empty
}

Есть ли способ вернуться так?

Я знаю, что могу просто положить его в блок if else, но я ненавижу писать, если что-то еще, это менее понятно или читаемо, на мой взгляд, когда есть еще несколько условий.

Ответы

Ответ 1

Просто используйте квалифицированный синтаксис [email protected]omingTrips: [email protected].

В Котлин, return внутри лямбда означает возвращение из внутренней вложенности fun ( не обращая внимания лямбды), и не допускается в лямбды, которые не встраиваются.

Синтаксис [email protected] используется для указания области возврата. Вы можете использовать имя функции, передаваемой лямбда (fetchUpcomingTrips) в качестве метки:

mainRepo.fetchUpcomingTrips { trips ->
    if (trips.isEmpty()) {
        showEmptyViews()
        [email protected] 
    }

    // ...
}

Связанные с:

Ответ 2

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

 mainRepo.fetchUpcomingTrips { trips ->
            if (trips.isEmpty()) {
                showEmptyViews()
                [email protected]
            }

            //run some code if it not empty
        }

Ответ 3

Возвращения позволяют нам вернуться из внешней функции. Наиболее важным вариантом использования является возврат из лямбда-выражения

Оператор return в анонимной функции будет возвращаться из анонимной функции.

fun foo() {
ints.forEach(fun(value: Int) {
    if (value == 0) return  // local return to the caller of the anonymous fun, i.e. the forEach loop
    print(value)
})
}

При возврате значения синтаксический анализатор отдает предпочтение квалифицированному возврату, т.е.

[email protected] 1

означает "return 1 at label @a", а не "вернуть помеченное выражение (@a 1)". Возврат По умолчанию возвращается из ближайшей закрывающей функции или анонимной функции.

Разрыв Завершает ближайший замкнутый контур.

Продолжить Переход к следующему шагу ближайшего замкнутого цикла.

Подробнее см. " Возвраты и переходы", "Разрыв" и "Продолжить наклейки".

Ответ 4

Альтернативой return может быть

mainRepo.fetchUpcomingTrips { trips ->
            if (trips.isEmpty())
                showEmptyViews()
            else {
                //run some code if it not empty
            }
        }