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.

  • kotlin grpc.StreamObserver para deletar en rx.PublishSubject
  • RxJava BehaviorSubject no emite el último elemento?
  • ¿Cómo podemos implementar Observable.flatMapCompletable?
  • Rx Java Retrofit con flatMap se ejecuta solo una vez
  • Aplicando transformación a cada elemento en Single <List <T >>
  • RxJava Observable.create envolver suscripciones observables
  • RxJava: anular la suscripción asincrónica observable desde dentro de otra producción asincrónica
  • ¿Cómo puedo pausar que un evento fluya a través de un observable?
  • Cómo get el último valor emitido de observable
  • Error de compilation de error de coincidencia de tipo Kotlin: Requiere éxito <T>, Encontrado MyError
  • Cómo controlar el flujo sin .flatMap, que rompe una stream reactiva que impide que operadores como distinctUntilChanged trabajen en toda la secuencia