Android從零開始學習Rxjava2(五)—— 變換運算符

rxjava2變換運算符

GroupBy

將一個Observable分拆爲一些Observables集合,它們中的每一個發射原始Observable的一個子序列,GroupBy操作符將原始Observable分拆爲一些Observables集合,它們中的每一個發射原始Observable數據序列的一個子序列。哪個數據項由哪一個Observable發射是由一個函數判定的,這個函數給每一項指定一個Key,Key相同的數據會被同一個Observable發射。
在這裏插入圖片描述
groupBy顧名思義是以xxx分組,groupBy的Function中,自定義分組邏輯將每個信息分配到對應的組,並將組的key標誌返回。GroupedObservable就可以根據key來篩選獲得對應組的元素。
舉個例子:

private void doSomeWork() {
        Observable.range(0, 10)
                .groupBy(new Function<Integer, String>() {
                    @Override
                    public String apply(Integer integer) throws Exception {
                        return integer % 2 == 0 ? "分組key1" : "分組key2";
                    }
                }).subscribe(new Consumer<GroupedObservable<String, Integer>>() {
            @Override
            public void accept(final GroupedObservable<String, Integer> stringIntegerGroupedObservable) throws Exception {
                Log.d(TAG, " accept : key : " + stringIntegerGroupedObservable.getKey());
                if (stringIntegerGroupedObservable.getKey().equalsIgnoreCase("分組key1"))
                    stringIntegerGroupedObservable.subscribe(new Consumer<Integer>() {
                        @Override
                        public void accept(Integer integer) throws Exception {
                            Log.d(TAG, " accept : key : " + stringIntegerGroupedObservable.getKey() + ",value : " + integer);
                        }
                    });
            }
        });
    }

將奇數、偶數分組,偶數分組設置個key,key可以自定義,這裏就叫分組key1;奇數分組key叫分組key2。
打印結果

accept : key : 分組key1
accept : key : 分組key1,value : 0
accept : key : 分組key2
accept : key : 分組key1,value : 2
accept : key : 分組key1,value : 4
accept : key : 分組key1,value : 6
accept : key : 分組key1,value : 8

Scan

按順序發出每個連續的值,將該函數的結果作爲其自己的第一個發射。然後 將函數的結果與源Observable發出的第二個項一起反饋到函數中,生成其第二個發射, 依此類推。
在這裏插入圖片描述
Scan掃描,它會順序的發射元素,通過scan函數裏面自定義的操作後,將自定義操作後的值作爲第一個元素傳到下次scan函數中。在某些情況下,這種運算符有時被稱爲“累加器”。所以我們舉個累加的例子:

private void doSomeWork() {
        Observable.range(0, 5)
                .scan(new BiFunction<Integer, Integer, Integer>() {
                    @Override
                    public Integer apply(Integer integer, Integer integer2) throws Exception {
                        Log.d(TAG, " accept : integer : " + integer + ",integer2 : " + integer2);
                        return integer + integer2;
                    }
                }).subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                Log.d(TAG, " accept : integer : " + integer);
            }
        });
    }

打印結果

accept : integer : 0
accept : integer : 0,integer2 : 1
accept : integer : 1
accept : integer : 1,integer2 : 2
accept : integer : 3
accept : integer : 3,integer2 : 3
accept : integer : 6
accept : integer : 6,integer2 : 4
accept : integer : 10

通過打印的結果我們可以看到,scan發射元素是順序執行的,並且會將函數的執行結果作爲下一次函數的第一個參數。

Window

定期將Observable中的項目細分爲Observable窗口併發出這些窗口,而不是一次發出一個項目。
Window類似於Buffer,但它不是從源Observable發出項目包,而是發出Observable,每個Observable都從源Observable發出一個項子集,然後用onCompleted通知終止。
在這裏插入圖片描述
舉個例子,每三秒將緩衝的數據發射出來:

private void doSomeWork() {
        Observable.interval(1, TimeUnit.SECONDS).take(10)
                .window(3, TimeUnit.SECONDS)
                .subscribe(new Consumer<Observable<Long>>() {
                    @Override
                    public void accept(Observable<Long> longObservable) throws Exception {
                        Log.d(TAG, "Sub Divide begin....");
                        longObservable.subscribe(new Consumer<Long>() {
                            @Override
                            public void accept(Long aLong) throws Exception {
                                Log.d(TAG, " accept : aLong : " + aLong);
                            }
                        });
                    }
                });
    }
Sub Divide begin....
accept : aLong : 0
accept : aLong : 1
accept : aLong : 2
Sub Divide begin....
accept : aLong : 3
accept : aLong : 4
Sub Divide begin....
accept : aLong : 5
accept : aLong : 6
accept : aLong : 7
Sub Divide begin....
accept : aLong : 8
accept : aLong : 9

參考資料,參考但不侷限以下鏈接
http://reactivex.io/documentation/operators.html#transforming

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