在lambda中使用return?

时间:2017-07-27 10:57:56

标签: lambda kotlin

在下面的代码中,我想显示我的空视图,如果trip是空的然后返回并避免运行下面的代码,但编译器说“这里不允许返回”。

mainRepo.fetchUpcomingTrips { trips ->
    if (trips.isEmpty()) {
        showEmptyViews()
        return
    }

    // run some code if it's not empty
}

有没有办法像这样回来?

我知道我可以把它放在一个if else块中,但是我讨厌写别的,如果有更多的条件,我认为它不太可理解/可读。

5 个答案:

答案 0 :(得分:33)

只需使用限定的返回语法:return@fetchUpcomingTrips

在Kotlin中,lambda内的return表示从最内层嵌套fun(忽略lambdas)返回,并且不允许在不是inlined的lambdas中。

return@label语法用于指定要返回的范围。您可以使用lambda传递给函数的函数名称(fetchUpcomingTrips)作为标签:

mainRepo.fetchUpcomingTrips { trips ->
    if (trips.isEmpty()) {
        showEmptyViews()
        return@fetchUpcomingTrips 
    }

    // ...
}

相关:

答案 1 :(得分:4)

您还可以将{ trips ->替换为fun(trips) {来形成anonymous function,可以正常使用return

答案 2 :(得分:3)

普通return建议您从函数返回。由于你无法从lambda中的函数返回,编译器会抱怨。相反,你想从lambda返回,你必须使用标签:

 mainRepo.fetchUpcomingTrips { trips ->
            if (trips.isEmpty()) {
                showEmptyViews()
                return@fetchUpcomingTrips
            }

            //run some code if it's not empty
        }

答案 3 :(得分:1)

返回允许我们从外部函数返回。最重要的用例是从lambda表达式返回

匿名函数中的return语句将从匿名函数本身返回。

fun foo() {
ints.forEach(fun(value: Int) {
    if (value == 0) return  // local return to the caller of the anonymous fun, i.e. the forEach loop
    print(value)
})
}

当返回一个值时,解析器优先考虑合格的返回,即

return@a 1

表示“在标签@a处返回1”而不是“返回标记表达式(@a 1)”。 返回默认情况下,从最近的封闭函数或匿名函数返回。

中断终止最近的封闭循环。

继续继续进行最近的封闭循环的下一步。

更多详情请参阅Returns and Jumps,Break and Continue Labels

答案 4 :(得分:0)

return的替代方案可能是

mainRepo.fetchUpcomingTrips { trips ->
            if (trips.isEmpty())
                showEmptyViews()
            else {
                //run some code if it's not empty
            }
        }