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();
  1. 括号中的有效示例如下:

    Completable.complete() 被执行,然后作为参数传递给 andThen

  2. 无效的只是简单地将花括号中的 lambda 作为参数传递给 andThen,它成为一个实现(感谢 SAM Conversion) of CompletableSource。它永远不会被执行。以下显示了您的操作:

    val compl = CompletableSource { Completable.complete() }
    Completable.complete()
        .andThen (compl)
        .test()
        .assertComplete()
        .assertComplete()