2017-08-17 371 views
11

我不明白使用RxJava时花括号和Kotlin中的正常括号之间的真正区别。例如,我有以下的代码按预期工作:RxJava和Kotlin的花括号和正常括号有什么区别

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

但下面不工作:

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

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

+0

我的问题不是关于行为 - 而是两个大括号之间的区别 - 在这种情况下,他们如何/为什么不同? – blackpanther

回答

5

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

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

在科特林,有一个惯例,如果一个函数的最后一个参数是一个函数,而你传递一个lambda表达式为相应的参数,你可以括号外的指定它:

lock (lock) { 
    sharedResource.operation() 
} 

由于科特林支持SAM conversion

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

回首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

.andThen(anotherMethodThatReturnsACompletable())意味着anotherMethodThatReturnsACompletable()结果将被传递到andThen()

.andThen { anotherMethodThatReturnsACompletable() }意味着拉姆达,执行anotherMethodThatReturnsACompletable()将被传递到andThen()

3

正如你可能知道,在Java中()括号用于传递参数,方括号使用大括号,也表示lambda表达式的主体。

所以让我们比较:

  1. .andThen(anotherMethodThatReturnsACompletable()): 这里andThen()方法接受Completable所以andThen将节省参考completable通过anotherMethodThatReturnsACompletable()方法返回后进行订阅。

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

希望它有帮助。

0

() - >你逝去的东西在里面他们即函数参数

{} - >您正在执行中他们的东西。即表达式

相关问题