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

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

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

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

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

Просто используйте квалифицированный синтаксис return@fetchUpcomingTrips : return@fetchUpcomingTrips .

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

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

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

Связанный:

  • Возврат на этикетках в языковой ссылке

  • Что означает «return @»?

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

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

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

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

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

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

 return@a 1 

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

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

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

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

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

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