私のプロジェクトの1つでRxJavaを使用しています。Android Studioプラグインを使用し、マップflatMap
lambda(JavaのFunc1)の1つを使用して、クラスの1つをKotlinに変換しました。 、中間体は次の@Func1
。
これが何を意味するのか分かりません。
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@label
構文 は、このステートメントが返す複数のネストされた関数の中でどの関数を指定するために使用されます。
関数リテラル(ラムダ)とローカル関数で動作します。ラベルのないreturn
ステートメントは、fun
を囲む最も近い(つまり最も内側の)ものから戻ります(ラムダを無視します)。次の機能を検討してください。
fun foo(ints: List<Int>) {
ints.forEach {
if (it == 0) return
print(it)
}
}
ここで、return
は、ラムダだけでなく、foo
の実行を終了します。
ただし、他の関数(ラムダまたは外側のfun
)から戻りたい場合は、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"]
非ローカルリターン (外部関数からのリターン)ラムダからのサポートは ローカル および インライン 関数でのみサポートされます。ラムダがインライン化(または関数がオブジェクト内に配置されている)、囲んでいる関数内でのみ呼び出されることは保証されません(たとえば、変数に格納して後で呼び出すことができます)。場合。
qualified this
にも同様の構文があり、外部スコープのレシーバーを参照するために使用されます:this@outer
。
return@name
は、どのクロージャーreturn
ステートメントを適用するかを決定します。
Kotlinでは、ネストされたクロージャーからreturnを呼び出して、外部クロージャーを終了できます。 Javaでは不可能です。
通常、@name
は省略できます。
この例では、Func1
が別の関数内で使用されているため、省略できません。