tutorial single rxjava rxandroid android rx-java kotlin

android - single - Kotlin: ¿Qué significa "return @"?



rxjava kotlin android tutorial (2)

En Kotlin, la sintaxis return@label se usa para especificar qué función entre varias anidadas devuelve esta declaración.

Funciona con funciones literales (lambdas) y funciones locales. Las declaraciones de retorno no etiquetadas return de la fun cierre más cercana (es decir, la más interna) (ignorando las lambdas). Considere esta función:

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 función (una lambda o una fun externa) debe especificarla como una etiqueta en la declaración 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"]

El retorno no local (es decir, el retorno de funciones externas) de un lambda solo se admite para funciones local e inline , porque si un lambda no está en línea (o una función se coloca dentro de un objeto), no se garantiza que se invoque solo dentro la función de cierre (por ejemplo, puede almacenarse en una variable y llamarse más tarde), y el retorno no local no tendría sentido en este caso.

También hay una sintaxis similar para this calificado , que se utiliza para hacer referencia a receptores de ámbitos externos: this@outer .

Estoy usando RxJava en uno de mis proyectos, convertí una de mis clases a Kotlin usando el complemento de Android Studio y en uno de map flatMap lambda (Func1 en java), los retornos intermedios se parecen a los 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) })


return@name determina a qué cierre se debe aplicar la declaración de return .

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

Por lo general, puede omitir @name .

En su ejemplo, no puede omitirlo porque Func1 se usa dentro de otra función.