RxJava2.0——變換操作符

Errol_King發表於2020-11-25

map()

Observable.create(new ObservableOnSubscribe<Integer>() {
            // 1. 被觀察者傳送事件 = 引數為整型 = 1、2、3
            @Override
            public void subscribe(@NonNull ObservableEmitter<Integer> emitter) throws Exception {
                emitter.onNext(1);
                emitter.onNext(2);
                emitter.onNext(3);
                emitter.onComplete();
            }
            // 2. 使用Map變換操作符中的Function函式對被觀察者傳送的事件進行統一變換:整型變換成字串型別
        }).map(new Function<Integer, String>() {
            @Override
            public String apply(@NonNull Integer integer) throws Exception {
                return "整型" + integer + " 變換成 字串型別" + integer;
            }
        }).subscribe(new Observer<String>() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {
                Log.d(TAG, "onSubscribe");
            }

            @Override
            public void onNext(@NonNull String s) {
                Log.d(TAG, "onNext" + s);
            }

            @Override
            public void onError(@NonNull Throwable e) {
                Log.d(TAG, "onError");
            }

            @Override
            public void onComplete() {
                Log.d(TAG, "onComplete");
            }
        });

在這裡插入圖片描述

FlatMap()

作用:將被觀察者傳送的事件序列進行 拆分 & 單獨轉換,再合併成一個新的事件序列,最後再進行傳送

注:新合併生成的事件序列順序是無序的,即 與舊序列傳送事件的順序無關

Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<Integer> emitter) throws Exception {
                emitter.onNext(1);
                emitter.onNext(2);
                emitter.onNext(3);
            }
        }).flatMap(new Function<Integer, ObservableSource<String>>() {
            @Override
            public ObservableSource<String> apply(@NonNull Integer integer) throws Exception {
                List<String> list = new ArrayList<String>();
                for (int i = 0; i < 2; i++) {
                    list.add("我是事件 " + integer + "拆分後的子事件" + i);
                }
                return Observable.fromIterable(list);
            }
        }).subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                Log.d(TAG, s);
            }
        });

在這裡插入圖片描述

ConcatMap()

作用:類似FlatMap()操作符

與FlatMap()的 區別在於:拆分 & 重新合併生成的事件序列 的順序 = 被觀察者舊序列生產的順序

Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<Integer> emitter) throws Exception {
                emitter.onNext(1);
                emitter.onNext(2);
                emitter.onNext(3);
            }
        }).concatMap(new Function<Integer, ObservableSource<String>>() {
            @Override
            public ObservableSource<String> apply(@NonNull Integer integer) throws Exception {
                final List<String> list = new ArrayList<>();
                for (int i = 0; i < 2; i++) {
                    list.add("我是事件 " + integer + "拆分後的子事件" + i);
                    // 通過concatMap中將被觀察者生產的事件序列先進行拆分,再將每個事件轉換為一個新的傳送三個String事件
                    // 最終合併,再傳送給被觀察者
                }
                return Observable.fromIterable(list);
            }
        }).subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                Log.d(TAG, s);
            }
        });

在這裡插入圖片描述

Buffer()

作用:
定期從 被觀察者(Obervable)需要傳送的事件中 獲取一定數量的事件 & 放到快取區中,最終傳送
應用場景:
快取被觀察者傳送的事件

Observable.just(1,2,3,4,5)
                .buffer(3,1)// 設定快取區大小 & 步長
                // 快取區大小 = 每次從被觀察者中獲取的事件數量
                // 步長 = 每次獲取新事件的數量
                .subscribe(new Observer<List<Integer>>() {
                    @Override
                    public void onSubscribe(@NonNull Disposable d) {
                        Log.d(TAG, "對Subscribe事件作出響應" );
                    }

                    @Override
                    public void onNext(@NonNull List<Integer> integers) {
                        Log.d(TAG, " 快取區裡的事件數量 = " +  integers.size());
                        for (Integer value : integers) {
                            Log.d(TAG, " 事件 = " + value);
                        }
                    }

                    @Override
                    public void onError(@NonNull Throwable e) {
                        Log.d(TAG, "對Error事件作出響應" );
                    }

                    @Override
                    public void onComplete() {
                        Log.d(TAG, "對Complete事件作出響應");
                    }
                });

在這裡插入圖片描述

Android RxJava:圖文詳解 變換操作符

相關文章