RxJava与Kotlin的花括号和普通括号之间的区别是什么

时间:2017-08-17 09:41:41

标签: android kotlin rx-java2

在使用RxJava时,我不了解花括号和Kotlin中的普通括号之间的真正区别。例如,我有以下代码按预期工作:

someMethodThatReturnsCompletable()
    .andThen(anotherMethodThatReturnsACompletable())
    .subscribe(...)

但以下不起作用:

someMethodThatReturnsCompletable()
    .andThen { anotherMethodThatReturnsACompletable() }
    .subscribe(...)

注意链的andThen()部分与花括号的区别。我无法理解两者之间的区别。我看过一些文章,但不幸的是我仍然难以理解这种微妙的差异。

4 个答案:

答案 0 :(得分:5)

第一个代码段执行anotherMethodThatReturnsACompletable()并将返回值传递给andThen(),其中Completable被接受为参数。

在第二个代码段中,您将函数文字编写为lambda expression。它将类型() -> Unit的函数传递给andThen(),它也是一个有效的语句,但lambda中的代码可能不会被调用。

  

在Kotlin中,有一个约定,如果函数的最后一个参数是一个函数,并且您将lambda表达式作为相应的参数传递,则可以在括号外指定它:

lock (lock) {
    sharedResource.operation()
}

由于Kotlin支持SAM conversion

  

这意味着只要接口方法的参数类型与Kotlin函数的参数类型匹配,Kotlin函数文字就可以使用单个非默认方法自动转换为Java接口的实现。

回顾Completable,有几个重载的andThen()函数:

andThen(CompletableSource next)
andThen(MaybeSource<T> next)
andThen(ObservableSource<T> next)
andThen(org.reactivestreams.Publisher<T> next)
andThen(SingleSource<T> next)

您可以在此处通过调用:

指定SAM类型
andThen( CompletableSource {
    //implementations
})

答案 1 :(得分:3)

您可能知道在Java中()括号用于传递参数,{}括号用于方法体,也表示lambda表达式的主体。

让我们比较一下:

  1. .andThen(anotherMethodThatReturnsACompletable()): 这里andThen()方法接受Completable所以然后保存对anotherMethodThatReturnsACompletable()方法返回的完成表的引用以便稍后订阅。

  2. .andThen { anotherMethodThatReturnsACompletable() }:这会将lambda表达式传递给andThen方法。这里传递lambda时不调用anotherMethodThatReturnsACompletable()。在andThen方法中调用lambda函数时,将调用anotherMethodThatReturnsACompletable()

  3. 希望它有所帮助。

答案 2 :(得分:1)

.andThen(anotherMethodThatReturnsACompletable())表示anotherMethodThatReturnsACompletable()的结果将传递给andThen()

.andThen { anotherMethodThatReturnsACompletable() }表示执行anotherMethodThatReturnsACompletable()的lambda将传递给andThen()

答案 3 :(得分:0)

() - &gt;你在里面传递一些东西,即函数参数

{} - &gt;你正在他们内部执行一些事情。即表达