RXKotlin Lambda 理解
RXKotlin Lambda Understanding
这永远不会完成:
Completable.complete()
.andThen{ Completable.complete() }
.test()
.assertComplete()
这确实完成了:
Completable.complete()
.andThen(Completable.complete())
.test()
.assertComplete()
根据杰克·沃顿的说法:
"你想要 andThen(Completable.complete())
。注意括号和
不是大括号。后者创建了一个不调用其发射器的 lambda。"
参考:https://github.com/ReactiveX/RxJava/issues/5551
任何人都可以更详细地解释一下吗?我以为我理解 lambda,但这真的让我很震惊。
使用大括号,您使用 SAM conversion 并通过在 lambda 中描述其单一方法来定义匿名 CompletableSource
实例。
这与执行以下操作相同:
Completable.complete()
.andThen(object: CompletableSource {
override fun subscribe(cs: CompletableObserver) {
Completable.complete()
}
})
.test()
.assertComplete()
如您所见,在这个 CompletableSource
中,除了创建一个 Completable
实例并丢弃其结果外,您什么也没做。要使链继续,您必须调用作为参数收到的 CompleteableObserver
上的方法(例如,您可以在其上调用 onNext()
和 onComplete()
)。
虽然语法几乎相同,但这里是 Java 版本,以防它帮助您理解事物:
Completable.complete()
.andThen(new CompletableSource() {
@Override
public void subscribe(CompletableObserver cs) {
Completable.complete();
}
})
.test()
.assertComplete();
括号中的有效示例如下:
Completable.complete()
被执行,然后作为参数传递给 andThen
。
无效的只是简单地将花括号中的 lambda 作为参数传递给 andThen
,它成为一个实现(感谢 SAM Conversion) of CompletableSource
。它永远不会被执行。以下显示了您的操作:
val compl = CompletableSource { Completable.complete() }
Completable.complete()
.andThen (compl)
.test()
.assertComplete()
.assertComplete()
这永远不会完成:
Completable.complete()
.andThen{ Completable.complete() }
.test()
.assertComplete()
这确实完成了:
Completable.complete()
.andThen(Completable.complete())
.test()
.assertComplete()
根据杰克·沃顿的说法:
"你想要 andThen(Completable.complete())
。注意括号和
不是大括号。后者创建了一个不调用其发射器的 lambda。"
参考:https://github.com/ReactiveX/RxJava/issues/5551
任何人都可以更详细地解释一下吗?我以为我理解 lambda,但这真的让我很震惊。
使用大括号,您使用 SAM conversion 并通过在 lambda 中描述其单一方法来定义匿名 CompletableSource
实例。
这与执行以下操作相同:
Completable.complete()
.andThen(object: CompletableSource {
override fun subscribe(cs: CompletableObserver) {
Completable.complete()
}
})
.test()
.assertComplete()
如您所见,在这个 CompletableSource
中,除了创建一个 Completable
实例并丢弃其结果外,您什么也没做。要使链继续,您必须调用作为参数收到的 CompleteableObserver
上的方法(例如,您可以在其上调用 onNext()
和 onComplete()
)。
虽然语法几乎相同,但这里是 Java 版本,以防它帮助您理解事物:
Completable.complete()
.andThen(new CompletableSource() {
@Override
public void subscribe(CompletableObserver cs) {
Completable.complete();
}
})
.test()
.assertComplete();
括号中的有效示例如下:
Completable.complete()
被执行,然后作为参数传递给andThen
。无效的只是简单地将花括号中的 lambda 作为参数传递给
andThen
,它成为一个实现(感谢 SAM Conversion) ofCompletableSource
。它永远不会被执行。以下显示了您的操作:val compl = CompletableSource { Completable.complete() } Completable.complete() .andThen (compl) .test() .assertComplete() .assertComplete()