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

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

Я понятия не имею, что это значит.

something.flatMap(Func1<ArticleCriteria, Observable<Pair<String, String>>> {
    val isTemporaryClone = it.isATemporaryClone
    val isTheOriginalToken = it.tokenIsOriginalHere

    if (isTemporaryClone) {
        if (!isTheOriginalToken) {
            [email protected] paramsError("Token is always original for temp articles")
        }

        [email protected] mJobRunner.doNotRun(DeleteArticleJob.TAG)
                            .doOnNext(deletePersonalActionById(articleId))
    }

    runArticleJobAsync(DeleteArticleJob.TAG, it)
})

Ответ 1

В Kotlin используется [email protected] синтаксис, чтобы указать, какая функция из нескольких вложенных из них возвращает этот оператор.

Он работает с литералами функций (lambdas) и локальными функциями. Немаркированные операторы return возвращаются с ближайшего (то есть самого внутреннего), охватывающего 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) [email protected] // implicit label for lambda passed to forEach
        print(it)
    }
}

fun foo(ints: List<Int>): List<String> {
    val result = ints.map [email protected]{
        if (it == 0) [email protected] "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"]

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


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

Ответ 2

[email protected] Определения, для которых должен применяться оператор закрытия return.

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

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

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