Kotlin:什么是"返回@"意思?

时间:2016-10-20 17:09:33

标签: android rx-java kotlin

我在我的一个项目中使用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)
})

2 个答案:

答案 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 returnlocal函数支持从lambda开始

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

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

答案 1 :(得分:7)

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

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

通常,您可以省略@name

在您的示例中,您无法省略它,因为在另一个函数中使用了Func1