在lambda中使用return?

Joz*_*eRi 29 lambda kotlin

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

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

    // run some code if it's not empty
}
Run Code Online (Sandbox Code Playgroud)

有没有办法像这样回来?

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

hot*_*key 48

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

在科特林,return拉姆达内部是指从最里面的嵌套的返回fun(忽略lambda表达式),并且它不以未允许lambda表达式内联.

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

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

    // ...
}
Run Code Online (Sandbox Code Playgroud)

有关:

  • @埃米尔S。非内联 lambda 可能不会就地调用,而是包装到传递给其他函数的实例中,然后调用,甚至可能在不同的线程上调用。在这种情况下,非限定的“return”(这意味着“从最近的“fun”返回”)无法工作。 (3认同)
  • 为什么 lambda 中不允许 return 呢?我不明白为什么它会被明确禁止。 (2认同)

nha*_*man 8

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

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

    //run some code if it's not empty
}
Run Code Online (Sandbox Code Playgroud)


Sol*_*cko 6

您也可以替换{ trips ->使用fun(trips) {,以形成一个匿名函数,可以使用return正常。