【问题标题】:RXKotlin Lambda UnderstandingRXKotlin Lambda 理解
【发布时间】:2018-01-30 18:36:40
【问题描述】:

这永远不会完成:

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 的,但这真的让我很震惊。

【问题讨论】:

    标签: lambda kotlin rx-kotlin


    【解决方案1】:

    使用花括号,您将使用 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();
    

    【讨论】:

    • 很好很好的解释,我一定很累了,这完全有道理。
    • 不幸的是,使用 Kotlin 和 Rx 的每个人都必须花费几个小时进行调试,这是其中一个陷阱。其他 Rx 类和运算符也会发生这种情况。
    • Brain melt :D 学习 Haskell 时,我的大脑受到了同样的伤害
    【解决方案2】:
    1. 括号中的有效示例如下:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-27
      • 2018-12-13
      • 2012-02-23
      • 2021-02-24
      • 1970-01-01
      相关资源
      最近更新 更多