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

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