Kotlin:什么是“返回@”是什么意思?

我在我的一个项目中使用RxJava,我使用Android Studio插件将我的一个类转换为Kotlin,并在map flatMap lambda(java中的Func1)之一中,返回的中间体看起来像下面的@Func1

我不知道这是什么意思。

 something.flatMap(Func1<ArticleCriteria, Observable<Pair>> { 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语法用于指定此语句返回的几个嵌套的函数。

它适用于函数文字(lambdas)和本地函数。 未标记的return语句从最近的(即最里面的)封闭fun (忽略lambdas)返回。 考虑这个function:

 fun foo(ints: List) { ints.forEach { if (it == 0) return print(it) } } 

return将完成foo的执行,而不仅仅是lambda。

但是如果你想从任何其他函数(lambda或外部fun )返回,你必须在return语句中将其指定为标签:

 fun foo(ints: List) { ints.forEach { if (it == 0) return@forEach // implicit label for lambda passed to forEach print(it) } } 

 fun foo(ints: List): List { 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"] 

lambda中的非局部返回 (即从外部函数返回)仅支持本地函数和内联函数,因为如果lambda没有内联(或函数放在对象内),则不保证仅在内部调用封闭函数(例如,它可以存储在variables中并稍后调用),在这种情况下非局部返回是没有意义的。


对于限定的this也有类似的语法,它用于引用外部范围的接收者: this@outer

return@name确定应该应用哪个闭包return语句。

在Kotlin中,您可以从嵌套闭包调用return来完成外部闭包。 在Java中,这是不可能的。

通常,您可以省略@name

在您的示例中,您不能省略它,因为Func1在另一个函数中使用。