RxJava

RxJava日常使用总结(二)变换操作

2020-10-25  本文已影响0人  h2coder

在使用RxJava的过程中,变换是很常用的,从一个数据类型转换到另外一个数据类型,再或者从一个Observable(数据源、管道)转接到另外一个Observable。

flatMap操作符

将一个发射数据的Observable变换为多个Observables,然后将它们发射的数据合并后放进一个单独的Observable。

image.png
public Observable<List<Images>> startUploadMultipleImage(Activity activity,
                                                             String tag,
                                                             List<String> filePaths) {
        return Observable.just(filePaths)
                .flatMap(new Function<List<String>, ObservableSource<String>>() {
                    @Override
                    public ObservableSource<String> apply(List<String> filePaths) throws Exception {
                        //1、压缩图片,得到压缩文件的path,遍历
                        List<String> compressFilePaths = Flora
                                .with(activity)
                                .bitmapConfig(Bitmap.Config.ARGB_8888)
                                .compressTaskNum(filePaths.size())
                                .load(filePaths)
                                .compressSync();
                        return Observable.fromIterable(compressFilePaths);
                    }
                })
                .flatMap(new Function<String, ObservableSource<Images>>() {
                    @Override
                    public ObservableSource<Images> apply(String path) throws Exception {
                        //2、对每张压缩图片进行上传
                        return startUploadImage(tag, path);
                    }
                })
                //3、结果堆积为List
                .toList()
                .toObservable();
    }

concatMap操作符

和flatMap类似,不过内部合并数据是使用concat,而不像flatMap是使用merge,导致顺序可能会不一致。我们使用concatMap改造上面图片上传的例子吧~

Observable.just(filePaths)
              //其实只改了这里
            .concatMap(new Function<List<String>, ObservableSource<String>>() {
                @Override
                public ObservableSource<String> apply(List<String> filePaths) throws Exception {
                        //...省略压缩代码
                    return Observable.fromIterable(compressFilePaths);
                }
            })
            //...
            .toObservable();

map操作符

对Observable发射的每一项数据应用一个函数,执行变换操作。简单理解就是将数据做处理转换,就像流水线工人,对流到工位的工件做处理,再输出给下个工位的流水线工人。

image.png
public Observable<Images> startUploadImage(String tag, String path) {
        FragmentActivity activity = getActivity();
        return Observable
                .just(path)
                .map(new Function<String, File>() {
                    @Override
                    public File apply(String path) throws Exception {
                        return new File(path);
                    }
                })
                .map(new Function<File, File>() {
                    @Override
                    public File apply(File file) throws Exception {
                        String compressFile = Flora.with(activity)
                                .bitmapConfig(Bitmap.Config.ARGB_8888)
                                .load(file).compressSync();
                        return new File(compressFile);
                    }
                })
                .flatMap(new Function<File, ObservableSource<HttpModel<Images>>>() {
                    @Override
                    public ObservableSource<HttpModel<Images>> apply(File file) throws Exception {
                        return UploadRequestManager.uploadImageFile(activity, tag, file);
                    }
                }).map(new Function<HttpModel<Images>, Images>() {
                    @Override
                    public Images apply(HttpModel<Images> model) throws Exception {
                        return model.getData();
                    }
                });
    }

cast操作符

操作符将原始Observable发射的每一项数据都强制转换为一个指定的类型,然后再发射 数据,它是 map 的一个特殊版本。

image.png
Object selectItemModel = onObtainCurrentSelectItemModel();
        Observable.fromIterable(mItems)
                .filter(new Predicate<Object>() {
                    @Override
                    public boolean test(Object itemModel) throws Exception {
                        return itemModel instanceof SingleSelectOptionModel;
                    }
                })
                .cast(SingleSelectOptionModel.class)
                .map(new Function<SingleSelectOptionModel, SingleSelectOptionModel>() {
                    @Override
                    public SingleSelectOptionModel apply(SingleSelectOptionModel optionModel) throws Exception {
                        if (optionModel.getItemData() == selectItemModel) {
                            optionModel.setSelect(true);
                        } else {
                            optionModel.setSelect(false);
                        }
                        return optionModel;
                    }
                })
                .all(new Predicate<SingleSelectOptionModel>() {
                    @Override
                    public boolean test(SingleSelectOptionModel optionModel) throws Exception {
                        return optionModel != null;
                    }
                })
                .as(RxLifecycleUtil.bindLifecycle(this))
                .subscribe(new Consumer<Boolean>() {
                    @Override
                    public void accept(Boolean isOk) throws Exception {
                        if (isOk) {
                            mAdapter.notifyDataSetChanged();
                            vStatusView.showContent();
                        }
                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                        vStatusView.showError();
                    }
                });
上一篇 下一篇

猜你喜欢

热点阅读