android - 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 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/

相关文章:

java - 在 Kotlin 中同时扩展和实现

android - 找不到字段的 setter - 将 Kotlin 与 Room 数据库结合使用

spring - 如何在基于 Spring 的强类型语言中正确执行 PATCH - 示例

kotlin - Kotlin 中线程和协程的区别

constructor - 如何在 Kotlin 中扩展具有多个构造函数的类?

unit-testing - 在 Kotlin 中测试预期的异常

android - 如何在 Android 上使用 Kotlin 显示 Toast?

android - 在当前主题中找不到样式 'cardView Style'

kotlin - 什么时候应该更喜欢 Kotlin 扩展函数?

java - Kotlin 'when' 语句与 Java 'switch'