J'utilise RxJava dans l'un de mes projets, j'ai converti une de mes classes en Kotlin en utilisant le Android plugin Studio et dans l'un des map flatMap
lambda (Func1 en Java) , les retours intermédiaires ressemblent à ce qui suit @Func1
.
Je n'ai aucune idée de ce que cela signifie.
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)
})
Dans Kotlin, le return@label
syntax est utilisé pour spécifier de quelle fonction parmi plusieurs imbriquées cette instruction retourne.
Il fonctionne avec les littéraux de fonction (lambdas) et les fonctions locales. Les instructions return
non étiquetées retournent à partir de l'enveloppe la plus proche (c'est-à-dire la plus intérieure) fun
(en ignorant les lambdas). Considérez cette fonction:
fun foo(ints: List<Int>) {
ints.forEach {
if (it == 0) return
print(it)
}
}
Ici, return
terminera l'exécution de foo
, pas seulement le lambda.
Mais si vous voulez revenir de n'importe quelle autre fonction (un lambda ou un fun
externe), vous devez le spécifier comme étiquette à l'instruction 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"]
retour non local (c'est-à-dire retour des fonctions externes) d'un lambda n'est pris en charge que pour les fonctions local et en ligne , car si un lambda n'est pas en ligne (ou une fonction est placée à l'intérieur d'un objet), il n'est pas garanti d'être appelé uniquement à l'intérieur de la fonction englobante (par exemple, il peut être stocké dans une variable et appelé plus tard), et le retour non local n'aurait aucun sens dans ce cas. Cas.
Il existe également une syntaxe similaire pour qualifié this
, qui est utilisée pour référencer les récepteurs des étendues externes: this@outer
.
return@name
détermine pour quelle instruction de fermeture return
doit être appliquée.
Dans Kotlin, vous pouvez appeler le retour de la fermeture imbriquée pour terminer la fermeture extérieure. En Java ce n'est pas possible.
Habituellement, vous pouvez omettre @name
.
Dans votre exemple, vous ne pouvez pas l'omettre car Func1
est utilisé dans une autre fonction.