我在我的一个项目中使用了RxJava,我使用Android Studio插件将我的一个类转换为Kotlin,在map flatMap lambda(java中的Func1)中的一个中,intermediates returns如下图@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)
})

推荐答案

In Kotlin, the return@label syntax is used for specifying which function among several nested ones this statement returns from.

It works with function literals (lambdas) and local functions. Non-labeled return statements return from the nearest (i.e. innermost) enclosing fun (ignoring lambdas). Consider this function:

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

Here, return will finish the execution of foo, not just the lambda.

But if you want to return from any other function (a lambda or an outer fun) you have to specify it as a label at return statement:

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"]

只有localinline函数支持从lambda返回Non-local return(即从外部函数返回),因为如果lambda没有内联(或将函数放在对象内部),则不能保证只在封闭函数内调用它(例如,它可以存储在变量中,稍后调用),在这种情况下,非本地返回没有意义.


There is also a similar syntax for qualified this, which is used to reference receivers of outer scopes: this@outer.

Kotlin相关问答推荐

这些Kotlin函数等效吗?

Kotlin-stdlib中的模拟扩展函数

在Kotlin中,我是否可以访问已知的WHEN子句值?

如何使用 Kotlin Maven 更改 Minecraft 插件中的 Shulker GUI 标题

为何Kotlin标准库中的AND和OR函数不能像&&和||一样进行短路运算?

判断 Kotlin 变量是否为函数

我们应该在 Effect 和 Either 之间 Select 哪个作为我们业务服务的返回类型?

如何从 kotlin 中的数据类访问 val?

Kotlin - 当表达式返回函数类型

如何创建 Kotlin DSL - DSL 语法 Kotlin

Android数据绑定在自定义视图中注入ViewModel

在粘贴时将 java 转换为 kotlin

Android Kotlin StringRes 数量String

如何捕获传递给模拟函数的参数并返回它?

如果作为 RxJava Observable 提供,Kotlin 密封类子类需要强制转换为基类

无法解决:androidx.lifecycle:lifecycle-extensions-ktx:2.0.0-alpha1

Kotlin中的属性(properties)和参数(parameters)有什么区别?

Failure delivering result on activity result

Android Jetpack Compose 中的文本渐变

Dagger 2 androidx fragment不兼容类型