Kotlin:“return @”是什么意思?

我在我的一个项目中使用了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语法用于指定这个语句返回的几个嵌套的函数中的哪一个函数。

它适用于函数文字(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"] 

使用本地功能:

 fun outer(): Int { fun inner(i: Int) { if (i < 0) return // this returns from `inner` -- the innermost fun if (i % 2 == 0) return@outer 0 // label is required to return from `outer` } inner(2) return 1 } 

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


还有一个类似的语法来限定this ,它被用来引用外部作用域的接收者: this@outer

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

在Kotlin中,可以调用从嵌套闭包返回来完成外闭包。 在Java中是不可能的。

通常,你可以省略@name

在你的例子中,你不能忽略它,因为Func1被用在另一个函数中。