Kotlin: ¿Qué significa "return @"?

Estoy usando RxJava en uno de mis proyectos, convertí una de mis classs a Kotlin usando el plugin de Android Studio y en una de las correlaciones flatMap lambda (Func1 en java), las devoluciones intermedias se parecen a las siguientes @Func1 .

No tengo idea de lo que esto significa.

 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) }) 

En Kotlin, la syntax de la return@label se usa para especificar qué function entre varias anidadas devuelve esta statement.

Funciona con literales de funciones (lambdas) y funciones locales. Las declaraciones de devolución no labeldas return de la fun encierro más cercana (es decir, más interna) (ignorando las lambdas). Considera esta function:

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

Aquí, return terminará la ejecución de foo , no solo la lambda.

Pero si desea regresar de cualquier otra function (una lambda o una fun externa), debe especificarla como una label en la statement de 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"] 

Uso con function local:

 fun outer(): Int { fun inner(i: Int) { if (i < 0) return // this returns from `inner` -- the innermost fun if (i % 2 == 0) return@outer 0 // label is requinetworking to return from `outer` } inner(2) return 1 } 

El retorno no local (es decir, retorno desde funciones externas) desde un lambda solo se admite para funciones locales y en línea , porque si un lambda no está alineado (o una function se coloca dentro de un object), no se garantiza que se invoque solo dentro la function adjunta (por ejemplo, se puede almacenar en una variable y llamar más tarde), y el retorno no local no tendría sentido en este caso.


También hay una syntax similar para this calificado , que se usa para referirse a receptores de ámbitos externos: this@outer .

return@name determina para qué statement de cierre de cierre se debe aplicar.

En Kotlin, puede llamar al retorno desde el cierre nested para finalizar el cierre externo. En Java no es posible.

Usualmente, puedes omitir @name .

En su ejemplo, no puede omitirlo porque Func1 se usa dentro de otra function.

  • Cómo get el valor emitido desde el primer observable
  • ¿Cuándo no usar el Observable de RxJava?
  • Cómo llenar una vista de list usando Kotlin, retroadaptación y RXjava
  • Adaptador personalizado de Moshi con RxAndroid & Retrofit & Kotlin
  • RxJava2 cómo separar diferentes implementaciones de emisor observable
  • rx.Scheduler no se puede proporcionar sin un método @ Provides- o @ Produces-anotado
  • ¿Cómo podemos implementar Observable.flatMapCompletable?
  • Métodos generics de Kotlin y inheritance
  • RxJava Observable.create envolver suscripciones observables
  • RXJava Ignorar error y continuar en cadena
  • ¿Cómo no emitir datos de Flowable para testings unitarias?