首页 > 解决方案 > 在 rxJava 中压缩超过 9 个 Observable

问题描述

面临需要进行 10-12 次小的并行查询并合并结果的情况。但是如果有一个 zip 方法可以让你最多组合 9 个 Observables,那么如何做更多我不明白。我尝试使用 zip 方法

public static <T, R> Observable<R> zip(Iterable<? extends ObservableSource<? extends T>> sources, Function<? super Object[], ? extends R> zipper)

但有一个错误

java.lang.ClassCastException: java.util.ArrayList cannot be cast to io.reactivex.ObservableSource

尝试看起来像这样

List<Observable> list = new ArrayList<>();
list.add(orderRepository.getOne(54, "id"));
list.add(orderRepository.getTwo(54, "id"));
list.add(orderRepository.getThree(54, "id"));
list.add(orderRepository.getFour(54, "id"));
list.add(orderRepository.getFive());
list.add(orderRepository.getSix(54, "id"));
list.add(orderRepository.getSeven(54, "id"));
list.add(orderRepository.getEight());
list.add(orderRepository.getNine());
list.add(orderRepository.getTen(54, "id"));
list.add(orderRepository.getEleven(54, "id"));
Observable.fromIterable(list);

return Observable.zip(list,
        new Function<Object[], OrderModel>() {
            @Override
            public OrderModel apply(Object[] objects) throws Exception {
                Logger.trace("objects = ", objects);
                return new OrderModel();
            }
        });

请举例说明如何在 Java 或 Kotlin 中执行此操作。

标签: androidkotlinrx-javaobservablereactivex

解决方案


    Observable one = Observable.zip(
        orderRepository.getOne(54, "id"), 
        orderRepository.getTwo(54, "id"),
        // Etc up to five (I think)
        Function zipper
    );

    Observable two = Observable.zip(
        one, orderRepository.getSix(54, "id"),
        orderRepository.getSeven(54, "id"),
        // Etc up to five,
        Function zipper
    );

冲洗并重复,直到你把所有的 observables 压缩在一起。


推荐阅读