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

RxJava 2 requires different Observable return type than RxJava 1 (Kotlin)

我正在将我的项目从 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) 的新 Observables 替换 observables 时,发生了错误。现在 IDE 说它需要遵循 return 类型:

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