Rxjava zip 运算符通过使用第一个 Observable android 检查数据来过滤第二个 Observable

卡西克科兰吉

我正在使用.zip运算符来组合 2API calls

我想要的是

我想2nd Observable根据一些ids来自1st Observable

例如

1st Observable 返回数据如(样本数据)

"categories": [
{
            "category": "1",
            "category_name": "Wedding Venues",
            "category_photo_url": "http://www.marriager.com/uploads/album/0463373001465466151-0463467001465466151.jpeg",
            "category_type_id": "1",

2nd Observable 返回数据,如:

"data": [
        {
            "cat_id": "1",
            "category_name": "Wedding Venues",
            "status": "1",
            "order_id": "1",
            "category_type_id": "1"
        },

我想过滤我的第二个 Observable 数据以仅返回与一个 Observable中的category_type_id匹配的值

我的代码

Observable obsService = retrofitService.loadService(getSharedPref().getVendorId());
Observable obsCategory = retrofitService.loadCategory();

Observable<ServiceAndCategory> obsCombined = Observable.zip(obsService.observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.io()), obsCategory.observeOn(AndroidSchedulers.mainThread()).subscribeOn(Schedulers.io()), new Func2<ServiceModel, CategoryModel, ServiceAndCategory>() {
            @Override
            public ServiceAndCategory call(ServiceModel serviceModel, CategoryModel categoryModel) {
                return new ServiceAndCategory(serviceModel, categoryModel);
            }
        });
        obsCombined.observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.io());

        obsCombined.subscribe(new Subscriber<ServiceAndCategory>() {
            @Override
            public void onCompleted() {


            }

            @Override
            public void onError(Throwable e) {
                if (e instanceof UnknownHostException || e instanceof ConnectException) {
                    mPresenter.onNetworkError();
                } else if (e instanceof SocketTimeoutException) {
                    mPresenter.onTimeOutError();
                } else {
                    mPresenter.onServerError();
                }
            }

            @Override
            public void onNext(ServiceAndCategory model) {

                mPresenter.onSuccess(model);
            }
        });

编辑

基本上我想应用以下逻辑

this.categoryList = combinedModel.categoryModel.getData();
        serviceList = combinedModel.serviceModel.getData().getCategories();

        for (int i = 0; i < serviceList.size(); i++) {

            for (int j = 0; j < categoryList.size(); j++) {

                if (!serviceList.get(i).getCategoryTypeId().equals(categoryList.get(j).getCategoryTypeId())) {

                    categoryList.remove(j);

                }

            }

        }
约斯里兹

您可以使用地图和列表通过反应式方法应用此过滤,首先将所有类别收集到地图中,将所有服务收集到列表中,将它们压缩在一起,然后根据类别地图过滤服务列表:

Observable<HashMap<Integer, CategoryData>> categoriesMapObservable =
        obsCategory
                .flatMapIterable(CategoryModel::getData)
                .reduce(new HashMap<>(),
                        (map, categoryData) -> {
                            map.put(categoryData.getCategoryTypeId(), categoryData);
                            return map;
                        }
                );

Observable<List<ServiceData>> serviceListObservable = obsService
        .map(ServiceModel::getData);

Observable obsCombined =
        Observable.zip(
                categoriesMapObservable
                        .subscribeOn(Schedulers.io()),
                serviceListObservable
                        .subscribeOn(Schedulers.io()),
                Pair::new
        )
                .flatMap(hashMapListPair -> {
                    HashMap<Integer, CategoryData> categoriesMap = hashMapListPair.first;
                    return Observable.from(hashMapListPair.second)
                            .filter(serviceData -> categoriesMap.containsKey(serviceData.getCategoryTypeId()))
                                .toList();
                    }, (hashMapListPair, serviceDataList) -> new Pair<>(hashMapListPair.first.values(), serviceDataList));

输出结果取决于你,在这里我最后应用一个选择器flatMap(),它将创建一个集合对CategoryData和一个过滤列表ServiceData,你当然可以创建你需要的任何自定义对象。

我不确定你是否从中获得了很多,从复杂性的角度来看似乎更有效,假设 HashMap 是 O(1),其中类别是 N,服务是 M,你在这里有 N + M(N 构建地图, M 迭代列表并查询地图),而您的幼稚实现将是 N x M。

至于代码复杂性,我不确定是否值得,您可以在 zip 的末尾应用您的逻辑进行过滤,或者使用一些可能更有效地进行过滤的库。

PS observerOn(AndroidSchedulers.mainThread() 是不必要的,所以我删除了它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Rxjava zip 运算符通过使用第一个 Observable android 检查数据来过滤第二个 Observable

来自分类Dev

RxJava,结合两个 observable 并发出第二个 observable

来自分类Dev

从android中的第一个observable接收结果后如何启动第二个observable?

来自分类Dev

如何过滤第二个Observable?

来自分类Dev

将Observable与第二个Observable结合使用第二个Observable,第一个使用

来自分类Dev

使用 RxJava 创建一个 Observable

来自分类Dev

无法使用 RX Android Observable.zip 运算符

来自分类Dev

RxJava / Android:合并两个相关Observable的结果

来自分类Dev

如果第一个observable为null,则angular rxjs仅订阅第二个Observable

来自分类Dev

RxJava从Observable更新数据

来自分类Dev

获取最新的其他 observable 的 RxJava zip

来自分类Dev

RxJava-如何获取列表的第一个元素并将其返回为Observable

来自分类Dev

RxJava-如何获取列表的第一个元素并将其返回为Observable

来自分类Dev

等到第二个Observable发出

来自分类Dev

如何调用两个方法,第一个返回 void observable,第二个返回 observable?

来自分类Dev

如何在 RxJava 中将 observable 包装在另一个 observable 中?

来自分类Dev

RxJava:如何对两个Observable进行.zip压缩,然后将其合并,最后减少以汇总所有结果

来自分类Dev

RxJava:使用“第一个”运算符时引发IllegalArgumentException

来自分类Dev

RxJs Observable的Observable Zip数组

来自分类Dev

使用 RXJava 缓存 observable。安卓

来自分类Dev

Android Rxjava如何使用Zip运算符

来自分类Dev

Observable 只发出第一个值

来自分类Dev

Observable 订阅只接收第一个事件

来自分类Dev

在完成另一个Observable之后触发第二个表单提交点击

来自分类Dev

为什么rxjs ajax运算符返回一个Observable?

来自分类Dev

Zip似乎不等待Observable发出数据

来自分类Dev

Zip似乎不等待Observable发出数据

来自分类Dev

Android中的RxJava没有Observable.create吗?

来自分类Dev

我如何使用 Observable 中的第一个也是最少的元素?

Related 相关文章

  1. 1

    Rxjava zip 运算符通过使用第一个 Observable android 检查数据来过滤第二个 Observable

  2. 2

    RxJava,结合两个 observable 并发出第二个 observable

  3. 3

    从android中的第一个observable接收结果后如何启动第二个observable?

  4. 4

    如何过滤第二个Observable?

  5. 5

    将Observable与第二个Observable结合使用第二个Observable,第一个使用

  6. 6

    使用 RxJava 创建一个 Observable

  7. 7

    无法使用 RX Android Observable.zip 运算符

  8. 8

    RxJava / Android:合并两个相关Observable的结果

  9. 9

    如果第一个observable为null,则angular rxjs仅订阅第二个Observable

  10. 10

    RxJava从Observable更新数据

  11. 11

    获取最新的其他 observable 的 RxJava zip

  12. 12

    RxJava-如何获取列表的第一个元素并将其返回为Observable

  13. 13

    RxJava-如何获取列表的第一个元素并将其返回为Observable

  14. 14

    等到第二个Observable发出

  15. 15

    如何调用两个方法,第一个返回 void observable,第二个返回 observable?

  16. 16

    如何在 RxJava 中将 observable 包装在另一个 observable 中?

  17. 17

    RxJava:如何对两个Observable进行.zip压缩,然后将其合并,最后减少以汇总所有结果

  18. 18

    RxJava:使用“第一个”运算符时引发IllegalArgumentException

  19. 19

    RxJs Observable的Observable Zip数组

  20. 20

    使用 RXJava 缓存 observable。安卓

  21. 21

    Android Rxjava如何使用Zip运算符

  22. 22

    Observable 只发出第一个值

  23. 23

    Observable 订阅只接收第一个事件

  24. 24

    在完成另一个Observable之后触发第二个表单提交点击

  25. 25

    为什么rxjs ajax运算符返回一个Observable?

  26. 26

    Zip似乎不等待Observable发出数据

  27. 27

    Zip似乎不等待Observable发出数据

  28. 28

    Android中的RxJava没有Observable.create吗?

  29. 29

    我如何使用 Observable 中的第一个也是最少的元素?

热门标签

归档