RxJava 2需要与RxJava 1(Kotlin)

时间:2017-07-15 00:53:28

标签: android kotlin rx-java rx-java2

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

您是否知道可能导致这种不同行为的原因?我该如何更改代码来修复它?

1 个答案:

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