我在我的一个项目中使用RxJava,我使用Android Studio插件将我的一个类转换为Kotlin,并在map 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)
})
答案 0 :(得分:56)
在Kotlin中,return@label
syntax用于指定此语句返回的几个嵌套的函数。
它适用于函数文字(lambdas)和本地函数。未标记的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和local函数支持从lambda开始inline(即从外部函数返回),因为如果没有内联lambda(或者函数放在一个内部)对象),不保证只在封闭函数内部调用(例如,它可以存储在变量中并稍后调用),在这种情况下非局部返回是没有意义的。
qualified this
也有类似的语法,用于引用外部范围的接收者:this@outer
。
答案 1 :(得分:7)
return@name
确定应该应用哪个闭包return
语句。
在Kotlin中,您可以从嵌套闭包调用return来完成外部闭包。在Java中,这是不可能的。
通常,您可以省略@name
。
在您的示例中,您无法省略它,因为在另一个函数中使用了Func1
。