最后,我根据上面给出的建议找到了解决方案。首先应该提到的是我们根本不应该返回可为空的 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)
})
}
我必须改变的唯一额外的事情是用 Function3 替换 lambda - 它解决了类型推断的问题。
如果 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)
})
}