RxJava 2需要比RxJava 1(科特林)不同的可观察到的返回类型
问题描述:
我更新我的项目从RxJava 1至2 RxJava我有这个扩展方法(我用的科特林):RxJava 2需要比RxJava 1(科特林)不同的可观察到的返回类型
fun <T : DatabaseModel> Observable<DataSnapshot?>.toObjectObservable(type: Class<T>): Observable<T> {
return this.map {
if (it == null) {
[email protected] null
}
val data = it.getValue(type)
data?.setId(it.key)
data
}
}
当我使用RxJava 1一切都很好。但是当我用来自RxJava 2的新Obserbles(io.reactivex.Observable)替换了observables时,发生了错误。现在IDE说,它需要以下返回类型:
((Datasnashot) -> T)!
,而不是提供
(Datasnapshot) -> T?
你有任何想法可能会导致此不同的行为?我应该如何更改代码来修复它?
答
RxJava 2 Observable
以任何方式不再接受null
。您的map
拉姆达正在生产T?
,但它需要是T
。你可以假设输入不为null,如果您还假设DataSnapshot.getValue()
非空,你的代码缩短了
fun <T : DatabaseModel> Observable<DataSnapshot>.toObjectObservable(type: Class<T>): Observable<T> {
return this.map {
val data = it.getValue(type)!!
data.setId(it.key)
data
}
}
当然,这将NPE(裹成一个Observable.error()
)如果DataSnapshot.getValue()
返回null。如果你愿意,你可以特别处理,例如放下它们。
fun <T : DatabaseModel> Observable<DataSnapshot>.toObjectObservable(type: Class<T>): Observable<T> {
return this.flatMap {
val data = it.getValue(type)
data.?setId(it.key)
if (data != null) Observable.just(data) else Observable.empty()
}
}