Observable.combineLatest 更新到 RxJava 后导致错误 2.x.x。 - 无法推断类型

Observable.combineLatest cause error after updating to RxJava 2.x.x. - cannot infer type

最近几天我试图将我的项目从 RxJava 1.x.x 迁移到 RxJava 2.x.x。我有这个简单的方法。如果我使用来自 rxjava 1.x.x (rx.Observable) 的 Observables,一切都很好。但是,当我用 "new" observables 替换它时(io.reactivex.Observable,我收到一条错误消息:"Type inference failed. Please specify it explicitly"

fun <T1, T2, T3, R> combineLatestValue3Nullable(observable1: Observable<T1?>, observable2: Observable<T2?>, observable3: Observable<T3?>, merge: (T1, T2, T3?) -> R): Observable<R?> {
    return Observable.combineLatest(observable1, observable2, observable3) {
        value1, value2, value3 ->
        var result: R? = null
        if (value1 != null && value2 != null) {
            result = merge(value1, value2, value3)
        }
        result
    }
}

你知道我做错了什么吗?你能解释一下在 RxJava 2 中究竟是什么导致了这个错误吗?

有人 () 遇到了与此非常相似的问题。然而,他们在他们的解决方案中使用了 BiFuntion,它接受两个参数并创建一个结果。如您所见,我使用了更多参数 (3),所以我不能在这里使用 Bifunction。

您是否正在使用 RxKotlin? If not, I'd suggest giving that a try as it has SAM helpers for various methods, including combineLatest, which is one of the methods affected. See their docs 了解更多信息。

最后我根据上面给出的建议找到了解决方案。首先要提到的是我们根本不应该 return nullable Observable。如果我们需要检查传递给 combineLatest 的值,我们应该在之前执行它,而不是在 combineLatest 中检查它。

当我们删除可空性时,该方法如下所示:

fun <T1, T2, T3, R> combineLatest(observable1: Observable<T1>, observable2: Observable<T2>, observable3: Observable<T3>, merge: (T1, T2, T3) -> R): Observable<R> {
    return Observable.combineLatest(observable1, observable2, observable3, Function3 {
        value1, value2, value3 ->
        merge(value1, value2, value3)
    })
}

我必须更改的唯一额外内容是将 lambda 替换为 Function3 - 它解决了类型推断的问题。

如果您只有两个 combineLatest 值,您可以使用 BiFuntion 而不是 Function3。

如果您需要将例如 6 个变量传递给 combineLatest,您可以使用 Function6 等。

查看以下所有变体:

fun <T1, T2, R> combineLatest(observable1: Observable<T1>, observable2: Observable<T2>, merge: (T1, T2) -> R): Observable<R> {
    return Observable.combineLatest(observable1, observable2, BiFunction {
        value1, value2 ->
        merge(value1, value2)
    })
}

fun <T1, T2, T3, R> combineLatest(observable1: Observable<T1>, observable2: Observable<T2>, observable3: Observable<T3>, merge: (T1, T2, T3) -> R): Observable<R> {
    return Observable.combineLatest(observable1, observable2, observable3, Function3 {
        value1, value2, value3 ->
        merge(value1, value2, value3)
    })
}

fun <T1, T2, T3, T4, R> combineLatest(observable1: Observable<T1>, observable2: Observable<T2>, observable3: Observable<T3>, observable4: Observable<T4>, merge: (T1, T2, T3, T4) -> R): Observable<R> {
    return Observable.combineLatest(observable1, observable2, observable3, observable4, Function4 {
        value1, value2, value3, value4 ->
        merge(value1, value2, value3, value4)
    })
}

fun <T1, T2, T3, T4, T5, R> combineLatest(observable1: Observable<T1>, observable2: Observable<T2>, observable3: Observable<T3>, observable4: Observable<T4>, observable5: Observable<T5>, merge: (T1, T2, T3, T4, T5) -> R): Observable<R> {

    return Observable.combineLatest(observable1, observable2, observable3, observable4, observable5, Function5 {
        value1, value2, value3, value4, value5 ->
        merge(value1, value2, value3, value4, value5)
    })
}

fun <T1, T2, T3, T4, T5, T6, R> combineLatest(observable1: Observable<T1>, observable2: Observable<T2>, observable3: Observable<T3>, observable4: Observable<T4>, observable5: Observable<T5>, observable6: Observable<T6>, merge: (T1, T2, T3, T4, T5, T6) -> R): Observable<R> {
    return Observable.combineLatest(observable1, observable2, observable3, observable4, observable5, observable6, Function6 {
        value1, value2, value3, value4, value5, value6 ->
        merge(value1, value2, value3, value4, value5, value6)
    })
}

fun <T1, T2, T3, T4, T5, T6, T7, R> combineLatest(observable1: Observable<T1>, observable2: Observable<T2>, observable3: Observable<T3>, observable4: Observable<T4>, observable5: Observable<T5>, observable6: Observable<T6>, observable7: Observable<T7>, merge: (T1, T2, T3, T4, T5, T6, T7) -> R): Observable<R> {
    return Observable.combineLatest(observable1, observable2, observable3, observable4, observable5, observable6, observable7, Function7 {
        value1, value2, value3, value4, value5, value6, value7 ->
        merge(value1, value2, value3, value4, value5, value6, value7)
    })
}

fun <T1, T2, T3, T4, T5, T6, T7, T8, R> combineLatest(observable1: Observable<T1>, observable2: Observable<T2>, observable3: Observable<T3>, observable4: Observable<T4>, observable5: Observable<T5>, observable6: Observable<T6>, observable7: Observable<T7>, observable8: Observable<T8>, merge: (T1, T2, T3, T4, T5, T6, T7, T8) -> R): Observable<R> {
    return Observable.combineLatest(observable1, observable2, observable3, observable4, observable5, observable6, observable7, observable8, Function8 {
        value1, value2, value3, value4, value5, value6, value7, value8 ->
        merge(value1, value2, value3, value4, value5, value6, value7, value8)
    })
}

我遇到了同样的问题。然后看到Kotlin有一个同名的函数,而且是默认使用的。所以我只是明确地导入了 RxJava 函数,这帮助我摆脱了错误:

import io.reactivex.functions.Function3