Rxjava操作符講解(4)Combining 結合操作

之前沒有了解過Rxjava的童鞋,建議先閱讀《Rxjava 從入門到開發》這篇文章,對入門比較有幫助。

StartWith操作符

作用:在數據序列的開頭增加一項數據

Observable.just(1,2).startWith(Observable.just(-1)).observeOn(Schedulers.io()).subscribe(new Action1<Integer>() {
        @Override
        public void call(Integer aLong) {
            Logger.i(String.valueOf(aLong));
        }
    });

輸出結果:

例子說明:在Startwith的作用下-1輸出在結果的最前面。

CombineLatest操作符

作用:當兩個Observables中的任何一個發射了數據時,使用一個函數結合每個Observable發射的最近數據項,并且基于這個函數的結果發射數據。

     //產生0,5,10數列
    Observable<Long> observable1 = Observable.interval(1000, TimeUnit.MILLISECONDS)
            .map(new Func1<Long, Long>() {
                @Override
                public Long call(Long aLong) {
                    return aLong * 5;
                }
            }).take(3);

    //產生0,10,20數列
    Observable<Long> observable2 = Observable.interval(500, TimeUnit.MILLISECONDS)
            .map(new Func1<Long, Long>() {
                @Override
                public Long call(Long aLong) {
                    return aLong * 10;
                }
            }).take(3);


    subscription=Observable.combineLatest(observable1, observable2, new Func2<Long, Long, Long>() {
        @Override
        public Long call(Long aLong, Long aLong2) {
            System.out.println("aLong: " + aLong+"  aLong2: "+aLong2);

            return aLong+aLong2;
        }
    }).subscribe(new Subscriber<Long>() {
        @Override
        public void onCompleted() {
            System.out.println("Sequence complete.");
        }

        @Override
        public void onError(Throwable e) {
            System.err.println("Error: " + e.getMessage());
        }

        @Override
        public void onNext(Long aLong) {
            System.out.println("Next: " + aLong);
        }
    });

輸出結果:

例子說明:observable1輸出的是0,5,10;observable2輸出的是0,10,20,輸出結果的關系如下圖:


數字的間隔就是時間差。

Join操作符

作用:join操作符把類似于combineLatest操作符,也是兩個Observable產生的結果進行合并,合并的結果組成一個新的Observable,但是join操作符可以控制每個Observable產生結果的生命周期,在每個結果的生命周期內,可以與另一個Observable產生的結果按照一定的規則進行合并。

join方法有四個參數,具體定義如下:
observableA.join(observableB, observableA產生結果生命周期控制函數, observableB產生結果生命周期控制函數, observableA產生的結果與observableB產生的結果的合并規則)

    //產生0,5數列
    Observable<Long> observable1 = Observable.interval(1000, TimeUnit.MILLISECONDS)
            .map(new Func1<Long, Long>() {
                @Override
                public Long call(Long aLong) {
                    return aLong * 5;
                }
            }).take(3);

    //產生0,10,20數列
    Observable<Long> observable2 = Observable.interval(1000, TimeUnit.MILLISECONDS)
            .map(new Func1<Long, Long>() {
                @Override
                public Long call(Long aLong) {
                    return aLong * 10;
                }
            }).take(3);

    subscription=observable1.join(observable2, new Func1<Long, Observable<Long>>() {
        @Override
        public Observable<Long> call(Long aLong) {
            return Observable.just(aLong).delay(500, TimeUnit.MILLISECONDS);
        }
    }, new Func1<Long, Observable<Long>>() {
        @Override
        public Observable<Long> call(Long aLong) {
            return Observable.just(aLong).delay(1000, TimeUnit.MILLISECONDS);
        }
    }, new Func2<Long, Long, Long>() {
        @Override
        public Long call(Long aLong, Long aLong2) {
            System.out.println("aLong: " + aLong+"  aLong2: "+aLong2);
            return aLong + aLong2;
        }
    }).subscribe(new Subscriber<Long>() {
        @Override
        public void onCompleted() {
            System.out.println("Sequence complete.");
        }

        @Override
        public void onError(Throwable e) {
            System.err.println("Error: " + e.getMessage());
        }

        @Override
        public void onNext(Long aLong) {
            System.out.println("Next: " + aLong);
        }
    });

輸出結果:

例子說明:其實輸出排列方式和combineLatest差不多,主要差別在通過join可以進一步控制observable結果的輸出時間周期,另外順便一提的是如果observable1輸出的數據只有兩個,那么即使observable2輸出3個數據,但最終輸出的也僅有兩個。

Merge操作符

作用:將多個Observable合并為一個。

    //產生0,5數列
    Observable<Long> observable1 = Observable.interval(1000, TimeUnit.MILLISECONDS)
            .map(new Func1<Long, Long>() {
                @Override
                public Long call(Long aLong) {
                    return aLong * 5;
                }
            }).take(2);

    //產生0,10,20數列
    Observable<Long> observable2 = Observable.interval(1000, TimeUnit.MILLISECONDS)
            .map(new Func1<Long, Long>() {
                @Override
                public Long call(Long aLong) {
                    return aLong * 10;
                }
            }).take(3);

    subscription=Observable.merge(observable1,observable2).subscribe(new Action1<Long>() {
        @Override
        public void call(Long aLong) {
            System.out.println("out: " + aLong);
        }
    });

輸出結果:

例子說明:把observable1,observable2的數據合并輸出。

switchOnNext操作符

作用:把一組Observable轉換成一個Observable,轉換規則為:對于這組Observable中的每一個Observable所產生的結果,如果在同一個時間內存在兩個或多個Observable提交的結果,只取最后一個Observable提交的結果給訂閱者。

Observable<Observable<Long>> observable = Observable.interval(500, TimeUnit.MILLISECONDS).map(new Func1<Long, Observable<Long>>() {
        @Override
        public Observable<Long> call(Long aLong) {
            //每隔200毫秒產生一組數據(0,10,20,30,40)
            return Observable.interval(200, TimeUnit.MILLISECONDS).map(new Func1<Long, Long>() {
                @Override
                public Long call(Long aLong) {
                    return aLong * 10;
                }
            }).take(3);
        }
    }).take(2);

    subscription=Observable.switchOnNext(observable).subscribe(new Action1<Long>() {
        @Override
        public void call(Long aLong) {
            System.out.println("Next:" + aLong);
        }
    });

輸出結果:

Paste_Image.png

例子說明:沒人Switch的作用下,輸出結果為“0,10,20,0,10,20”,但是在Switch的作用下,結果為“0,10,0,10,20”,少了“20”,這就是switch的作用。

zip操作符

作用:把兩個observable提交的結果,嚴格按照順序進行合并。

   Observable<Long> observable1=  Observable.interval(1, TimeUnit.SECONDS).take(3);
    Observable<Long> observable2=  Observable.interval(1, TimeUnit.SECONDS).take(4);
    subscription=Observable.zip(observable1, observable2, new Func2<Long, Long, Integer>() {

        @Override
        public Integer call(Long aLong, Long aLong2) {
            System.out.println("aLong:" + aLong+"   aLong2:  "+aLong2);

            return (int) (aLong+aLong);
        }
    }).subscribe(new Action1<Integer>() {
        @Override
        public void call(Integer integer) {
            System.out.println("result:" + integer);
        }
    });

輸出結果:

例子說明:最終輸出為“0,2,4”,兩個Observable輸出的數據一一按順序對應,無法對應的數據就拋棄,例子中的observable2本應該輸出4個數據take(4)但是由于操作符zip的作用下,最終只輸出3個數據。

以上便是結合操作符的主要內容了。rxjava的主要操作符講了差不多,有啥問題歡迎大家留言交流下??,歡迎關注。

附錄:
文章demo

參考:
ReactiveX/RxJava文檔中文版
Android RxJava使用介紹(四) RxJava的操作符

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容