RxJava 2 需要与 RxJava 1 (Kotlin) 不同的 Observable return 类型
RxJava 2 requires different Observable return type than RxJava 1 (Kotlin)
我正在将我的项目从 RxJava 1 更新到 RxJava 2。我有这个扩展方法(我使用 Kotlin):
fun <T : DatabaseModel> Observable<DataSnapshot?>.toObjectObservable(type: Class<T>): Observable<T> {
return this.map {
if (it == null) {
return@map null
}
val data = it.getValue(type)
data?.setId(it.key)
data
}
}
当我使用 RxJava 1 时一切正常。但是当我用来自 RxJava 2 (io.reactivex.Observable) 的新 Observables 替换 observables 时,发生了错误。现在 IDE 说它需要遵循 return 类型:
((Datasnashot) -> T)!
而不是提供
(Datasnapshot) -> T?
您知道是什么导致了这种不同的行为吗?我应该如何更改代码来修复它?
RxJava 2 Observable
不再以任何方式接受 null
。您的 map
lambda 正在生成 T?
,但它必须是 T
。您可以假设输入是非空的,如果您还假设 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
}
}
当然,如果 DataSnapshot.getValue()
returns 为 null,这将是 NPE(包装成 Observable.error()
)。如果你愿意,你可以专门处理,例如删除它们。
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()
}
}
我正在将我的项目从 RxJava 1 更新到 RxJava 2。我有这个扩展方法(我使用 Kotlin):
fun <T : DatabaseModel> Observable<DataSnapshot?>.toObjectObservable(type: Class<T>): Observable<T> {
return this.map {
if (it == null) {
return@map null
}
val data = it.getValue(type)
data?.setId(it.key)
data
}
}
当我使用 RxJava 1 时一切正常。但是当我用来自 RxJava 2 (io.reactivex.Observable) 的新 Observables 替换 observables 时,发生了错误。现在 IDE 说它需要遵循 return 类型:
((Datasnashot) -> T)!
而不是提供
(Datasnapshot) -> T?
您知道是什么导致了这种不同的行为吗?我应该如何更改代码来修复它?
RxJava 2 Observable
不再以任何方式接受 null
。您的 map
lambda 正在生成 T?
,但它必须是 T
。您可以假设输入是非空的,如果您还假设 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
}
}
当然,如果 DataSnapshot.getValue()
returns 为 null,这将是 NPE(包装成 Observable.error()
)。如果你愿意,你可以专门处理,例如删除它们。
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()
}
}