RxJava - 可观察的 zip 列表

2022-09-02 20:07:04

我有一个可观察量列表(RxJava 1)。

List<Observable> observableList = new ArrayList<>();

它可以包含至少 1 个可观察量。每个都有相同类型的结果。

如何压缩所有可观察量的结果?

我想到了zip运算符,但它不支持List,我不知道可观察量的数量(它可以是1,2,3,4....)


答案 1

你可以使用静态 zip(java.lang.Iterable<? extends Observable<?>> ws,FuncN<? extends R> zipFunction) 方法

它是一种采用一个s和一个FuncN(其方法采用varargs参数)的方法,并使用它来将发出的相应s合并到结果中,由新返回的结果省略。zipIterableObservablecallObjectObservable

例如,您可以执行以下操作:

Observable.zip(observableList, new FuncN(){
    public ReturnType call(java.lang.Object... args){
        ReturnType result; //to be made
        //preparatory code for using the args
        for (Object obj : args){
            ReturnType retObj = (ReturnType)obj;
            //code to use the arg once at a time to combine N of them into one.
        }
        return result;
    }
});

答案 2

ReactiveX - Zip 运算符

超越双功能的拉链

Zip 通过指定函数将多个可观察量的发射组合在一起,并根据此函数的结果为每个组合发出单个项目

此处,list 是要传递的任何类型的可观察量的数组列表。

val list = arrayListOf<Observable<ImageUrlResponse>>()


Observable.zip(list) { args -> Arrays.asList(args) }
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe({
        val response = it[0]
        val imageUrlResponse = imageUrlObject as ImageUrlResponse
        urls.add(imageUrlResponse.imageUrl)}
               }, {
        val c = it
 })

以下订阅的结果如下图所示。就像我们期望它被压缩在一起一样。你也可以注意到它返回所有要压缩在单个java.lang.Object[]中的响应。

注意 我必须键入强制转换我的数组列表才能访问我的单个对象,因为它的类型为 Any!

enter image description here


推荐