Ich verwende RxJava in einem meiner Projekte, ich habe eine meiner Klassen mit dem Android Studio-Plugin und in einer der Karten in Kotlin konvertiert flatMap
Lambda (Func1 in Java), Zwischenrückgaben sehen wie folgt aus @Func1
.
Ich habe keine Ahnung, was das bedeutet.
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)
})
In Kotlin, der return@label
Syntax wird verwendet, um anzugeben, von welcher Funktion unter mehreren verschachtelten diese Anweisung zurückkehrt.
Es arbeitet mit Funktionsliteralen (Lambdas) und lokalen Funktionen. Unbeschriftet return
Anweisungen kommen von der nächsten (dh innersten) Umschließung zurück fun
(Lambdas ignorieren). Betrachten Sie diese Funktion:
fun foo(ints: List<Int>) {
ints.forEach {
if (it == 0) return
print(it)
}
}
Hier, return
wird die Ausführung von beenden foo
nicht nur das Lambda.
Wenn Sie jedoch von einer anderen Funktion (einer Lambda- oder einer äußeren fun
) müssen Sie es als Label bei angeben return
Aussage:
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"]
Nicht-lokale Rückkehr (dh Rückgabe von äußeren Funktionen) von einem Lambda wird nur für unterstützt lokal und in der Reihe Funktionen, denn wenn ein Lambda nicht inline ist (oder eine Funktion in ein Objekt platziert wird), ist es nicht garantiert, dass es nur innerhalb der einschließenden Funktion aufgerufen wird (z. B. kann es in einer Variablen gespeichert und später aufgerufen werden), und die nicht- Eine lokale Rückgabe würde in diesem Fall keinen Sinn machen.
Es gibt auch eine ähnliche Syntax für qualifiziert this
das verwendet wird, um Empfänger von äußeren Bereichen zu referenzieren: this@outer
.
return@name
bestimmt für welche Schließung return
Aussage angewendet werden soll.
In Kotlin können Sie die Rückkehr von der verschachtelten Schließung aufrufen, um die äußere Schließung zu beenden. In Java ist dies nicht möglich.
In der Regel können Sie darauf verzichten @name
.
In Ihrem Beispiel können Sie es nicht weglassen, weil Func1
wird innerhalb einer anderen Funktion verwendet.