Gle*_*nna 55 android kotlin rx-java
我在我的一个项目中使用RxJava,我使用Android Studio插件将我的一个类转换为Kotlin,并在一个map 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)
})
Run Code Online (Sandbox Code Playgroud)
hot*_*key 67
在Kotlin中,return@label
语法用于指定此语句返回的几个嵌套的函数.
它适用于函数文字(lambdas)和本地函数.未标记的return
语句从最近的(即最里面的)封闭fun
(忽略lambdas)返回.考虑这个功能:
fun foo(ints: List<Int>) {
ints.forEach {
if (it == 0) return
print(it)
}
}
Run Code Online (Sandbox Code Playgroud)
在这里,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)
}
}
Run Code Online (Sandbox Code Playgroud)
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"]
Run Code Online (Sandbox Code Playgroud)
lambda中的非局部返回(即从外部函数返回)仅支持本地函数和内联函数,因为如果没有内联lambda(或函数放在对象内),则不保证仅在内部调用封闭函数(例如,它可以存储在变量中并稍后调用),在这种情况下非局部返回是没有意义的.
还有一个类似的语法为合格this
,其被用来引用外部范围的接收机:this@outer
.
return@name
确定return
应该应用哪个闭包语句.
在Kotlin中,您可以从嵌套闭包调用return来完成外部闭包.在Java中,这是不可能的.
通常,您可以省略@name
.
在您的示例中,您不能省略它,因为Func1
在另一个函数中使用.
归档时间: |
|
查看次数: |
13986 次 |
最近记录: |