我在我的一个项目中使用 RxJava,我使用 Android Studio 插件将我的一个类转换为 Kotlin,并在其中一个映射 flatMap
lambda(Java 中的 Func1)中,中间体返回外观像下面的 @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)
})
最佳答案
在 Kotlin 中,return@label
syntax用于指定该语句从几个嵌套函数中返回的函数。
它适用于函数字面量 (lambda) 和本地函数。未标记的 return
语句从最近的(即最里面的)包含 fun
的语句返回(忽略 lambdas)。考虑这个函数:
fun foo(ints: List<Int>) {
ints.forEach {
if (it == 0) return
print(it)
}
}
这里,return
会完成foo
的执行,而不仅仅是lambda。
但如果你想从任何其他函数(lambda 或外部 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"]
Non-local return (即从外部函数返回)来自 lambda 仅支持 local和 inline函数,因为如果 lambda 没有内联(或函数放置在对象内),则不能保证仅在封闭函数内调用它(例如,它可以存储在变量中并稍后调用),并且非在这种情况下,本地返回没有任何意义。
qualified this
也有类似的语法。 ,用于引用外部作用域的接收者:this@outer
.
https://stackoverflow.com/questions/40160489/