2017-07-15 25 views
0

我更新我的项目从RxJava 1至2 RxJava我有这个扩展方法(我用的科特林):RxJava 2需要比RxJava 1(科特林)不同的可观察到的返回类型

fun <T : DatabaseModel> Observable<DataSnapshot?>.toObjectObservable(type: Class<T>): Observable<T> { 
    return this.map { 
     if (it == null) { 
      [email protected] null 
     } 
     val data = it.getValue(type) 
     data?.setId(it.key) 
     data 
    } 
} 

当我使用RxJava 1一切都很好。但是当我用来自RxJava 2的新Obserbles(io.reactivex.Observable)替换了observables时,发生了错误。现在IDE说,它需要以下返回类型:

((Datasnashot) -> T)! 

,而不是提供

(Datasnapshot) -> T? 

你有任何想法可能会导致此不同的行为?我应该如何更改代码来修复它?

回答

2

RxJava 2 Observable以任何方式不再接受null。您的map拉姆达正在生产T?,但它需要是T。你可以假设输入不为null,如果您还假设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 
    } 
} 

当然,这将NPE(裹成一个Observable.error())如果DataSnapshot.getValue()返回null。如果你愿意,你可以特别处理,例如放下它们。

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() 
    } 
} 
相关问题