RxJava 2需要与RxJava 1(Kotlin)不同的Observable返回类型

我正在更新我的项目从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? 

你有什么想法可能会导致这种不同的行为? 我应该如何改变代码来修复它?

One Solution collect form web for “RxJava 2需要与RxJava 1(Kotlin)不同的Observable返回类型”

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()返回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() } } 
  • RxJava2如何分离不同的可观察发射器的实现
  • Kotlin和RxJava2 zip运算符 - 以下函数都不能用提供的参数调用
  • RxJava2发布
  • Rxjava与kotlin
  • 在RxKotlin / RxJava中用BehaviorSubject自动创建热可观察对象
  • 使用RxJava2创建一个带有生成函数的流程图
  • 测试RxJava2流动查询室
  • 如何在RxJava2中默默跳过异常?
  • 对于用作表达式的Kotlin函数,有没有简洁的方法来操作并返回一个值?
  • RxJava和Kotlin数据类copy()操作中的线程切换成本
  • 如何使用RxJava2 combineLatest与Kotlin中的可观察列表
  • Kotlin language will be the best programming language for Android.