android rxjava2 zip vararg参数

问题描述 投票:0回答:2

我现在正在研究android kotlin中的rxjava2。并尝试编写一个压缩多个可观察者和观察者的函数。但这似乎有些错误。有人可以帮忙吗?首先,我尝试编写可观察的zip 2,它可以工作。但是当我想将其扩展为vararg时,它将失败。

fun <T> ApiSubscribeZip2(observable1: Observable<T>, observable2: Observable<T>, observer: Observer<List<T>>) {
    Observable.zip(observable1, observable2, BiFunction<T, T, List<T>> { t1: T, t2: T ->
        zipAdd(t1, t2)
    })
        ?.subscribeOn(Schedulers.io())?.unsubscribeOn(Schedulers.io())?.observeOn(AndroidSchedulers.mainThread())
        ?.subscribe(observer as Observer<in List<T>>)
}

fun <T> ApiSubscribeZipN(vararg observable: Observable<T>?, observer: Observer<List<T>>) {
    Observable.zip(observable, Function<T, List<T>> { it ->
        zipAdd(it)

    })
}

private fun <T> zipAdd(vararg observableType: T): List<T> {
    val list = ArrayList<T>()
    for (ob in observableType) {
        list.add(ob)
    }
    return list
}

apisubscribezipN显示使用提供的参数无法调用以下函数。

android kotlin zip rx-java2
2个回答
0
投票

您可以像这样使用Observable.zipIterable

fun <T> ApiSubscribeZipN(vararg observable: Observable<T>?, observer: Observer<List<T>>) {
    Observable.zipIterable<T, List<T>>(observable.filterNotNull().toList(), { it.toList() as List<T>? }, false, 100)
        .subscribeOn(Schedulers.io()).unsubscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.io())
        .subscribe(observer)
}


0
投票

这呢?

import io.reactivex.Observable
import io.reactivex.functions.Function
import org.junit.Test

fun <T> apiSubscribeZipN(vararg observable: Observable<T>?): Observable<List<T>> {
    val filterNotNull = observable.filterNotNull()
    return Observable.zip(filterNotNull, Function { inArr ->
        inArr.map {
            it as T
        }
    })
}

测试

@Test
fun whatever() {
    val mergeWith1 = Observable.fromArray("test11", "test12").mergeWith(Observable.never())
    val mergeWith2 = Observable.fromArray("test21", "test22").mergeWith(Observable.never())

    apiSubscribeZipN(mergeWith1, mergeWith2)
        .test()
        .assertValues(listOf("test11", "test21"), listOf("test12", "test22"))
}
© www.soinside.com 2019 - 2024. All rights reserved.