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? 

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

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() } }