我正在将我的项目从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)中的新Observable替换了observable时发生了错误。现在IDE说它需要跟随返回类型:
((Datasnashot) -> T)!
而不是提供
(Datasnapshot) -> T?
您是否知道可能导致这种不同行为的原因?我该如何更改代码来修复它?
答案 0 :(得分:2)
RxJava 2 Observable
不再以任何方式接受null
。您的map
lambda正在生成T?
,但它必须是T
。您可以假设输入为非null,如果您还假设DataSnapshot.getValue()
为非null,则代码缩短为
fun <T : DatabaseModel> Observable<DataSnapshot>.toObjectObservable(type: Class<T>): Observable<T> {
return this.map {
val data = it.getValue(type)!!
data.setId(it.key)
data
}
}
当然,如果Observable.error()
返回null,这将是NPE(包装成DataSnapshot.getValue()
)。如果你愿意,你可以特别处理,例如放弃它们。
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()
}
}