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

Я использую RxJava в одном из моих проектов, я преобразовал один из своих классов в Kotlin, используя плагин Android Studio, и в одной из карт lambda (Func1 в java) mapMedia1, промежуточные результаты выглядят следующим образом @Func1 .

Я без понятия что это значит.

 something.flatMap(Func1<ArticleCriteria, Observable<Pair<String, String>>> { val isTemporaryClone = it.isATemporaryClone val isTheOriginalToken = it.tokenIsOriginalHere if (isTemporaryClone) { if (!isTheOriginalToken) { return@Func1 paramsError("Token is always original for temp articles") } return@Func1 mJobRunner.doNotRun(DeleteArticleJob.TAG) .doOnNext(deletePersonalActionById(articleId)) } runArticleJobAsync(DeleteArticleJob.TAG, it) }) 

В Kotlin синтаксис return@label используется для указания функции из нескольких вложенных, из которой этот оператор возвращается.

Он работает с функциональными литералами (lambdas) и локальными функциями. Немаркированные операторы возврата возвращаются от ближайшего (то есть самого внутреннего), охватывающего fun (игнорируя lambdas). Рассмотрим эту функцию:

 fun foo(ints: List<Int>) { ints.forEach { if (it == 0) return print(it) } } 

Здесь return завершает выполнение foo , а не только лямбда.

Но если вы хотите вернуться из любой другой функции (лямбда или внешнего fun ), вы должны указать ее как ярлык в инструкции return :

 fun foo(ints: List<Int>) { ints.forEach { if (it == 0) return@forEach // implicit label for lambda passed to forEach print(it) } } 

 fun foo(ints: List<Int>): List<String> { val result = ints.map f@{ if (it == 0) return@f "zero" // return at named label if (it == -1) return emptyList() // return at foo "number $it" // expression returned from lambda } return result } foo(listOf(1, -1, 1)) // [] foo(listOf(1, 0, 1)) // ["number 1", "zero", "number 1"] 

Нелокальное возвращение (т. Е. Возврат из внешних функций) из лямбда поддерживается только для локальных и встроенных функций, потому что, если лямбда не встроена (или функция помещена внутри объекта), она не может быть вызвана только внутри (например, он может быть сохранен в переменной и вызывается позже), и нелокальный возврат не имеет смысла в этом случае.


Существует также аналогичный синтаксис для this , который используется для ссылки на приемники внешних областей: this@outer .

return@name define, для которых должен применяться оператор return .

В Котлин вы можете вызвать возврат из вложенного закрытия, чтобы закончить внешнее закрытие. В Java это невозможно.

Обычно вы можете опустить @name .

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