Rxjava學習(轉換Observable)

Transforming Observables(轉換Observable)

1、Map

對Observable發射的每一項數據應用一個函數,執行變換操作

 //將Integer類型轉換爲String類型
        Observable.just(123).map(new Func1<Integer, String>() {
            @Override
            public String call(Integer integer) {
                System.out.println("call():" + integer);
                return integer + "";
            }
        }).subscribe(new Subscriber<String>() {
            @Override
            public void onCompleted() {
                System.out.println("onCompleted()");
            }

            @Override
            public void onError(Throwable throwable) {
                System.out.println("onError():" + throwable.getMessage());
            }

            @Override
            public void onNext(String s) {
                System.out.println("onNext():" + s);
            }
        });

運行結果:

call():123
onNext():123
onCompleted()

2、FlatMap

FlatMap 將一個發射數據的Observable變換爲多個Observables,然後將它們發射的數據合併 後放進一個單獨的Observable

FlatMap 操作符使用一個指定的函數對原始Observable發射的每一項數據執行變換操作,這 個函數返回一個本身也發射數據的Observable,然後FlatMap 合併這些Observables發射的數 據,最後將合併後的結果當做它自己的數據序列發射。 

Observable.just(1, 2, 3, 4, 5, 6).flatMap(new Func1<Integer, Observable<? extends String>>() {
            @Override
            public Observable<? extends String> call(Integer integer) {
                System.out.println("Observable():" + integer);
                //return null;
                return Observable.just(integer + "");
            }
        }).subscribe(new Subscriber<String>() {
            @Override
            public void onCompleted() {
                System.out.println("onCompleted()");
            }

            @Override
            public void onError(Throwable throwable) {
                System.out.println("onError():" + throwable.getMessage());
            }

            @Override
            public void onNext(String s) {
                System.out.println("onNext():" + s);
            }
        });

運行結果:

Observable():1
onNext():1
Observable():2
onNext():2
Observable():3
onNext():3
Observable():4
onNext():4
Observable():5
onNext():5
Observable():6
onNext():6
onCompleted()

3、GroupBy

//將一個Observable分拆爲一些Observables集合,它們中的每一個發射原始Observable的一個 子序列,
//哪個數據項由哪一個Observable發射是由一個函數判定 的,這個函數給每一項指定一個Key,
//Key相同的數據會被同一個Observable發射.

Observable.range(1, 8).groupBy(new Func1<Integer, String>() {
            @Override
            public String call(Integer integer) {
                return (integer % 2 == 0) ? "偶數組" : "奇數組";
            }
        }).subscribe(new Action1<GroupedObservable<String, Integer>>() {
            @Override
            public void call(final GroupedObservable<String, Integer> stringIntegerGroupedObservable) {

                String key = stringIntegerGroupedObservable.getKey();
                System.out.println("group name:" + key);

                if (key.equalsIgnoreCase("奇數組")) {
                    stringIntegerGroupedObservable.subscribe(new Action1<Integer>() {
                        @Override
                        public void call(Integer integer) {
                            System.out.println(key + "'member: " + integer);
                        }
                    });
                } else if (key.equalsIgnoreCase("偶數組")) {
                    stringIntegerGroupedObservable.subscribe(new Action1<Integer>() {
                        @Override
                        public void call(Integer integer) {
                            System.out.println(key + "'member: " + integer);
                        }
                    });
                }
            }
        });

運行結果:

group name:奇數組
奇數組'member: 1
group name:偶數組
偶數組'member: 2
奇數組'member: 3
偶數組'member: 4
奇數組'member: 5
偶數組'member: 6
奇數組'member: 7
偶數組'member: 8 

4、Buffer

定期收集Observable的數據放進一個數據包裹,然後發射這些數據包裹,而不是一次發射一 個值。

Buffer 操作符將一個Observable變換爲另一個,原來的Observable正常發射數據,變換產生 的Observable發射這些數據的緩存集合。

Buffer 操作符在很多語言特定的實現中有很多種變體,它們在如何緩存這個問題上存在區別。
注意:如果原來的Observable發射了一個 onError通知, Buffer會立即傳遞這個通知,而不 是首先發射緩存的數據,即使在這之前緩存中包含了原始Observable發射的數據。

Observable.range(1, 10).buffer(3).subscribe(new Observer<List<Integer>>() {

            @Override
            public void onNext(List<Integer> number) {
                System.out.println("onNext() ------>>>> " + number);
            }

            @Override
            public void onCompleted() {
                System.out.println("Complete!");
            }

            @Override
            public void onError(Throwable e) {
                System.out.println("onError!");
            }
        });

運行結果:

onNext() ------>>>> [1, 2, 3]
onNext() ------>>>> [4, 5, 6]
onNext() ------>>>> [7, 8, 9]
onNext() ------>>>> [10]
Complete! 

5、Scan

連續地對數據序列的每一項應用一個函數,然後連續發射結果

//連續地對數據序列的每一項應用一個函數,然後連續發射結果
        Observable.range(1, 10).scan(new Func2<Integer, Integer, Integer>() {
            @Override
            public Integer call(Integer integer, Integer integer2) {
                return integer + integer2;
            }
        }).subscribe(new Action1<Integer>() {
            @Override
            public void call(Integer integer) {
                System.out.println(integer + "");
            }
        });

運行結果:

1
3
6
10
15
21
28
36
45
55

這裏首先1 第二項是前面輸出的1再加上2,第三項是前面的1+2再加上3.....

6、Window

定期將來自原始Observable的數據分解爲一個Observable窗口,發射這些窗口,而不是每次 發射一項數據

Window 和 Buffer 類似,但不是發射來自原始Observable的數據包,它發射的是 Observables,這些Observables中的每一個都發射原始Observable數據的一個子集,最後發 射一個 onCompleted 通知。 

Observable.range(1, 10).window(3).subscribe(new Action1<Observable<Integer>>() {
            @Override
            public void call(final Observable<Integer> obser) {
                obser.subscribe(new Action1<Integer>() {
                    @Override
                    public void call(Integer integer) {
                        System.out.println(integer + " of window " + obser);
                    }
                });
            }
        });

運行結果:

1 of window rx.subjects.UnicastSubject@421faab1
2 of window rx.subjects.UnicastSubject@421faab1
3 of window rx.subjects.UnicastSubject@421faab1
4 of window rx.subjects.UnicastSubject@25f38edc
5 of window rx.subjects.UnicastSubject@25f38edc
6 of window rx.subjects.UnicastSubject@25f38edc
7 of window rx.subjects.UnicastSubject@1a86f2f1
8 of window rx.subjects.UnicastSubject@1a86f2f1
9 of window rx.subjects.UnicastSubject@1a86f2f1
10 of window rx.subjects.UnicastSubject@3eb07fd3

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