RXKotlin Lambda了解

RXKotlin Lambda了解,lambda,kotlin,rx-kotlin,Lambda,Kotlin,Rx Kotlin,这永远不会完成: Completable.complete() .andThen{ Completable.complete() } .test() .assertComplete() 这就完成了: Completable.complete() .andThen(Completable.complete()) .test() .assertComplete() 根据杰克·沃顿的说法: “您需要和(

这永远不会完成:

Completable.complete()
        .andThen{ Completable.complete() }
        .test()
        .assertComplete()
这就完成了:

Completable.complete()
        .andThen(Completable.complete())
        .test()
        .assertComplete()
根据杰克·沃顿的说法:

“您需要
和(Completable.complete())
。请注意括号和 不是花括号。后者创建的lambda不调用其发射器。”

参考:


有人能更详细地解释一下吗?我原以为我理解兰姆达的,但这真的让我很困惑

使用大括号,通过在lambda中描述匿名
CompletableSource
实例的单个方法,可以使用和定义该实例

这与执行以下操作相同:

Completable.complete()
        .andThen(object: CompletableSource {
            override fun subscribe(cs: CompletableObserver) {
                Completable.complete()
            }
        })
        .test()
        .assertComplete()
正如您所看到的,在这个
CompletableSource
中,您除了创建一个
Completable
实例并丢弃它的结果之外,什么也不做。要使链继续,必须调用作为参数接收的
completableobserver
上的方法(例如,可以调用
onNext()
onComplete()


虽然它的语法几乎相同,但以下是Java版本,以防它有助于您理解:

Completable.complete()
        .andThen(new CompletableSource() {
            @Override
            public void subscribe(CompletableObserver cs) {
                Completable.complete();
            }
        })
        .test()
        .assertComplete();

使用大括号,您可以通过描述lambda中的单个方法来使用和定义匿名
CompletableSource
实例

这与执行以下操作相同:

Completable.complete()
        .andThen(object: CompletableSource {
            override fun subscribe(cs: CompletableObserver) {
                Completable.complete()
            }
        })
        .test()
        .assertComplete()
正如您所看到的,在这个
CompletableSource
中,您除了创建一个
Completable
实例并丢弃它的结果之外,什么也不做。要使链继续,必须调用作为参数接收的
completableobserver
上的方法(例如,可以调用
onNext()
onComplete()


虽然它的语法几乎相同,但以下是Java版本,以防它有助于您理解:

Completable.complete()
        .andThen(new CompletableSource() {
            @Override
            public void subscribe(CompletableObserver cs) {
                Completable.complete();
            }
        })
        .test()
        .assertComplete();
  • 括号中的有效示例如下所示:

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

  • 无效的函数只需将一个大括号中的lambda作为参数传递给
    ,然后
    ,这将成为的一个实现(感谢)。它永远不会被执行。下面显示了您的操作:

    val compl = CompletableSource { Completable.complete() }
    Completable.complete()
        .andThen (compl)
        .test()
        .assertComplete()
        .assertComplete()
    
  • 括号中的有效示例如下所示:

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

  • 无效的函数只需将一个大括号中的lambda作为参数传递给
    ,然后
    ,这将成为的一个实现(感谢)。它永远不会被执行。下面显示了您的操作:

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

  • 很好很好的解释,我一定很累了,这完全有道理。不幸的是,每个使用Kotlin和Rx的人都必须花几个小时进行调试。其他Rx类和运营商也会发生这种情况。大脑融化:D同样的事情伤害了我的大脑试图学习Haskell很棒的解释,我一定很累了,这是完全有道理的。不幸的是,每个使用Kotlin和Rx的人都必须花几个小时进行调试。这种情况也发生在其他Rx类和运营商身上。大脑融化:D这和我试图学习Haskell时伤害大脑的事情是一样的