RXKotlin Lambda了解

时间:2018-01-30 18:36:41

标签: lambda kotlin rx-kotlin

这永远不会完成:

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,但这确实让我感到震惊。

2 个答案:

答案 0 :(得分:3)

使用大括号,您正在使用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 :(得分:1)

  1. 括号中的有效示例如下:

    执行

    Completable.complete(),然后将其作为参数传递给andThen

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

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