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() } }
- 要求在Kotlin中使用“allOf”的批注注释
- Android Kotlin – 无法调用onNavigationItemSelected方法
- 如何跳过基础包中的retrofit2使用的proguard模型?
- 使用Parcelable时,Kotlin编译错误
- 将Firebase中的数据加载到ExpandableList
- 在Kodein中传递lambda作为参数
- 无法在Android中为Kotlin中的Activity类编写主要构造函数
- Haskell中的HasSupportFragmentInjector问题 – DispatchingAndroidInjector为null
- 使用Espresso的Android仪器测试失败:NoSuchMethodError javax.inject.Provider中的get()