在使用RxJava时,我不了解花括号和Kotlin中的普通括号之间的真正区别。例如,我有以下代码按预期工作:
someMethodThatReturnsCompletable()
.andThen(anotherMethodThatReturnsACompletable())
.subscribe(...)
但以下不起作用:
someMethodThatReturnsCompletable()
.andThen { anotherMethodThatReturnsACompletable() }
.subscribe(...)
注意链的andThen()
部分与花括号的区别。我无法理解两者之间的区别。我看过一些文章,但不幸的是我仍然难以理解这种微妙的差异。
答案 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表达式的主体。
让我们比较一下:
.andThen(anotherMethodThatReturnsACompletable())
:
这里andThen()方法接受Completable
所以然后保存对anotherMethodThatReturnsACompletable()
方法返回的完成表的引用以便稍后订阅。
.andThen { anotherMethodThatReturnsACompletable() }
:这会将lambda表达式传递给andThen方法。这里传递lambda时不调用anotherMethodThatReturnsACompletable()
。在andThen方法中调用lambda函数时,将调用anotherMethodThatReturnsACompletable()
。
希望它有所帮助。
答案 2 :(得分:1)
.andThen(anotherMethodThatReturnsACompletable())
表示anotherMethodThatReturnsACompletable()
的结果将传递给andThen()
.andThen { anotherMethodThatReturnsACompletable() }
表示执行anotherMethodThatReturnsACompletable()
的lambda将传递给andThen()
答案 3 :(得分:0)
()
- &gt;你在里面传递一些东西,即函数参数
{}
- &gt;你正在他们内部执行一些事情。即表达