Rxjava從使用到原碼的解析六: Rxjava合併型操作符

Rxjava合併型操作符 : 二個或以上的被觀察者進行合併

startWith

 

concatWith

跟startWith相反

concat

 

merge

合併操作符,跟concat一樣,但是他跟concat不同的是他是並列的

zip

startWith

        //Observable(被觀察者1).startWith(Observable(被觀察者2)) 他們先執行被觀察者2裏發射的事件再執行被觀察者1裏發射的事件
        Disposable subscribe = Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                e.onNext(10001);
                e.onNext(10002);
                e.onNext(10003);
            }
        }).startWith(Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                e.onNext(20001);
                e.onNext(20002);
                e.onNext(20003);
            }
        })).subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                Log.e(TAG, "accept " + integer);
            }
        });

concat

//最多可以存4個
        Disposable subscribe = Observable.concat(
                Observable.just("1"), 
                Observable.just("2"), 
                Observable.just("3"), 
                Observable.create(new ObservableOnSubscribe<String>() {
                    @Override
                    public void subscribe(ObservableEmitter<String> e) throws Exception {
                        e.onNext("4");
                        e.onComplete();
                    }
                })).subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                Log.e(TAG, "accept " + s);
            }
        });

上面代碼 會按順序輸出 1 2 3 4

merge

        //start : 開始累計;  count: 累計多少個數量;  initialDelay: 開始等待的時間;  period :每隔多久執行;
        Observable observable1 = Observable.intervalRange(1, 4, 1, 2, TimeUnit.SECONDS);// 1 2 3 4
        Observable observable2 = Observable.intervalRange(6, 5, 1, 2, TimeUnit.SECONDS);//6 7 8 9 10
        Observable observable3 = Observable.intervalRange(11, 6, 1, 2, TimeUnit.SECONDS);//11 12 13 14 15 16

        Observable.merge(observable1,observable2,observable3)
                .subscribe(new Consumer() {
                    @Override
                    public void accept(Object o) throws Exception {
                        Log.e(TAG, "accept " + o.toString());
                    }
                });

 

上面將三個定時發射事件的觀察者合併成了一個,他是接收是並列的.同時執行一樣

zip

        //課程觀察者
        Observable<String> observable1 = Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> e) throws Exception {
                e.onNext("歷史");
                e.onNext("物理");
                e.onNext("地理");
                e.onNext("英語");
                e.onComplete();
            }
        });
        //分數觀察者
        Observable<Integer> observable2 = Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> e) throws Exception {
                e.onNext(91);
                e.onNext(82);
                e.onNext(93);
                e.onComplete();
            }
        });

        Disposable subscribe = Observable.zip(observable1, observable2, new BiFunction<String, Integer, Object>() {
            @Override
            public StringBuffer apply(String s, Integer integer) throws Exception {
                return new StringBuffer().append("課程:").append(s).append("=").append(integer).append("分");
            }
        }).subscribe(new Consumer<Object>() {
            @Override
            public void accept(Object o) throws Exception {
                Log.e(TAG, "最終考試的結果是" + o.toString());
            }
        });

對應的數據是一一對應的.如果一個多了那麼不對應的就不會執行.

 

Rxjava理解一

Rxjava理解二

Rxjava理解三

Rxjava理解四

Rxjava理解五

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章