RxJava進階二(轉(zhuǎn)換類操作符)

RxJava進階

RxJava進階一(創(chuàng)建類操作符)
RxJava進階二(轉(zhuǎn)換類操作符)
RxJava進階三(過濾類操作符)
RxJava進階四(組合類操作符)


前言

前面我們了解了RXJava的創(chuàng)建類操作符,這篇文章帶著大家熟悉一下RxJava的轉(zhuǎn)換類操作符,本系列文章僅是帶大家認識一下這些操作符的用法,并沒有對操作符進行多種形態(tài)的使用,具體的還要大家在使用時注意~

操作符總覽

Buffer、FlatMap、GroupBy、GroupBy、Map、Scan、Window...

具體使用介紹

Buffer

可以簡單的理解為緩存,它可以批量或者按周期性從Observable收集數(shù)據(jù)到一個集合,然后把這些數(shù)據(jù)集合打包發(fā)射,而不是一次發(fā)射一個數(shù)據(jù)~

代碼示例1:批量收集

        //一次訂閱2個
        Observable.range(1, 5).buffer(2).subscribe(new Subscriber<List<Integer>>() {
            @Override
            public void onCompleted() {
                System.out.println("onCompleted");
            }

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

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

運行結(jié)果:

批量收集

代碼示例:周期收集

        Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                while (true) {
                    subscriber.onNext("消息" + System.currentTimeMillis());
                    SystemClock.sleep(2000);//每隔2s發(fā)送消息
                }

            }
        }).subscribeOn(Schedulers.io()).buffer(3, TimeUnit.SECONDS).subscribe(new Observer<List<String>>() {
            @Override
            public void onCompleted() {
                System.out.println("onCompleted");
            }

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

            @Override
            public void onNext(List<String> integers) {
                System.out.println("onNext" + integers.toString());
            }
        });

FlatMap

扁平映射,作用是將一個原始Observable發(fā)射的數(shù)據(jù)進行變化,輸出一個或多個Observable,然后將這些Observable發(fā)射的數(shù)據(jù)平坦化的放進一個單獨的Observable(參數(shù)一般是Func1)~

        List<String> stringList = new ArrayList<>();
        stringList.add("one");
        stringList.add("two");
        stringList.add("three");
        Observable.just(stringList).flatMap(new Func1<List<String>, Observable<String>>() {
            @Override
            public Observable<String> call(List<String> list) {
                return Observable.from(list);
            }
        }).subscribe(new Action1<String>() {
            @Override
            public void call(String next) {
                System.out.println("onNext -->" + next);
            }
        });

運行結(jié)果:

flatMap

Map##

映射,一般用于對原始的數(shù)據(jù)進行加工處理,返回一個加工過后的數(shù)據(jù)~

代碼示例:

        List<String> stringList = new ArrayList<>();
        stringList.add("one");
        stringList.add("two");
        stringList.add("three");
        Observable.just(stringList).map(new Func1<List<String>, String>() {
            @Override
            public String call(List<String> strings) {
                return strings.toString();
            }
        }).subscribe(new Action1<String>() {
            @Override
            public void call(String next) {
                System.out.println("onNext -->" + next);
            }
        });

運行結(jié)果:

map

GroupBy##

代碼示例:

        Observable.range(0, 4).groupBy(new Func1<Integer, Integer>() {
            @Override
            public Integer call(Integer integer) {
                return integer % 2;//分成基數(shù)偶數(shù)兩組
            }
        }).subscribe(new Action1<GroupedObservable<Integer, Integer>>() {
            @Override
            public void call(GroupedObservable<Integer, Integer> integerIntegerGroupedObservable) {
                integerIntegerGroupedObservable.subscribe(new Action1<Integer>() {
                    @Override
                    public void call(Integer integer) {
                        System.out.println("Group -->" + integerIntegerGroupedObservable.getKey() + "  &&  OnNext -->" + integer);
                    }
                });
            }
        });

運行結(jié)果:

GroupBy

Sacn##

sacn操作符是遍歷源Observable產(chǎn)生的結(jié)果,通過自定義轉(zhuǎn)換規(guī)則,依次輸出結(jié)果給訂閱者,

示例代碼:

        Observable.range(0, 4).scan(new Func2<Integer, Integer, Integer>() {
            // 第一個參數(shù)是上次的結(jié)算結(jié)果,
            // 第二個參數(shù)是當此的源observable的輸入值
            @Override
            public Integer call(Integer lastResult, Integer currentInput) {
                return lastResult + currentInput;
            }
        }).subscribe(new Action1<Integer>() {
            @Override
            public void call(Integer result) {
                System.out.println("onNext -->" + result);
            }
        });

運行結(jié)果:

sacn

Window##

窗口,它可以批量或者按周期性從Observable收集數(shù)據(jù)到一個集合,然后把這些數(shù)據(jù)集合打包發(fā)射,而不是一次發(fā)射一個數(shù)據(jù),類似于Buffer,但Buffer發(fā)射的是數(shù)據(jù),Window發(fā)射的是Observable~

示例代碼:

        Observable.range(1, 5).window(2).subscribe(new Action1<Observable<Integer>>() {
            @Override
            public void call(Observable<Integer> integerObservable) {
                System.out.println("onOutsideNext -->" + integerObservable);
                integerObservable.subscribe(new Action1<Integer>() {
                    @Override
                    public void call(Integer integer) {
                        System.out.println("onInsideNext -->" + integer);
                    }
                });
            }
        });

運行結(jié)果:

window

結(jié)語

轉(zhuǎn)換類操作符,就簡單介紹到這里,希望能夠?qū)ν瑢W有所幫助,謝謝~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容