在 lambda 中使用 return ?

问题描述 投票:0回答:7

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

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

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

有办法这样返回吗?

我知道我可以把它放在 if else 块中,但我讨厌写 if else,在我看来,当有更多条件时,它不太容易理解/可读。

lambda kotlin
7个回答
128
投票

只需使用限定返回语法:

return@fetchUpcomingTrips

在 Kotlin 中, lambda 内的

return
表示从最内层嵌套
fun
返回(忽略 lambda),并且在非内联的 lambda 中不允许这样做。

return@label

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

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

相关:


30
投票
您也可以将

{ trips ->

替换为
fun(trips) {
,形成
匿名函数,可以正常使用return


10
投票
您可以

返回标签

fun foo() { println("begin foo") listOf(1, 2, 3, 4, 5).forEach lit@{ // local return, meaning this function execution will end // the forEach will continue to the next element in the loop if (it == 3) return@lit println("- $it") } println("done with explicit label") }

这里有游乐场演示


8
投票
Plain

return

 建议您从函数返回。由于您无法从 lambda 内的函数返回,因此编译器会抱怨。相反,您想从 lambda 返回,并且必须使用标签:

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

3
投票
返回允许我们从外部函数返回。最重要的用例是从 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)”。

Return 默认情况下从最近的封闭函数或匿名函数返回。

Break 终止最近的封闭循环。

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

更多详情请参阅

返回和跳转、中断和继续标签


1
投票

return

的替代方案可能是

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

0
投票
我的方式

bleManager.onWriteValueStatus = onWriteValueStatus@{ bleWriteInfo -> if (bleWriteInfo.characteristic != CharacteristicUUID.RPC.value) { return@onWriteValueStatus } }
    
© www.soinside.com 2019 - 2024. All rights reserved.