RxJava基礎(chǔ)八-聚合操作符

此篇內(nèi)容均是來自書籍《RxJava響應(yīng)式編程》李衍順 著

3.8 聚合操作符

3.8.1 concat

concat操作符將多個(gè)Observable結(jié)合成一個(gè)Observable并發(fā)送數(shù)據(jù),并且嚴(yán)格按照先后順序發(fā)送數(shù)據(jù),即前一個(gè)Observable數(shù)據(jù)沒有發(fā)送完時(shí),后面的Observable是不能發(fā)送數(shù)據(jù)的。

有兩個(gè)操作符與concat操作符很類似,他們分別是:
-startWith:僅僅是在前面插上一個(gè)Observable或者一些數(shù)據(jù),并且先發(fā)送插入的內(nèi)容
-merge:其發(fā)送的數(shù)據(jù)是無序的,也就是說被組合的多個(gè)Observable是可以自由發(fā)送數(shù)據(jù)的,而不用管其它的Observable的狀態(tài)。

/**
     * concat
     */
    private void concatTest(){
        Observable<Integer> observable1 = Observable.just(1,2,3);
        Observable<Integer> observable2 = Observable.just(4,5,6);
        Observable<Integer> observable3 = Observable.just(7,8,9);
        Observable.concat(observable1, observable3, observable2)
                .subscribe(new Action1<Integer>() {
                    @Override
                    public void call(Integer integer) {
                        log("concat: " + integer);
                    }
                });
    }
結(jié)果:
concat: 1
concat: 2
concat: 3
concat: 7
concat: 8
concat: 9
concat: 4
concat: 5
concat: 6

3.8.2 count

count操作符用來統(tǒng)計(jì)源Observable發(fā)送了多少個(gè)數(shù)據(jù),最后將數(shù)目發(fā)送出來。如果源Observable發(fā)送錯(cuò)誤,則會(huì)將錯(cuò)誤直接報(bào)出來。在源Observable停止發(fā)送前,count是不會(huì)發(fā)送統(tǒng)計(jì)數(shù)據(jù)的

/**
     * count
     */
    private void countTest(){
        Observable.just(1,2,3).count()
                .subscribe(new Action1<Integer>() {
                    @Override
                    public void call(Integer integer) {
                        log("count: " + integer);
                    }
                });
    }
結(jié)果:
count: 3

3.8.3 reduce

reduce操作符應(yīng)用一個(gè)函數(shù)接收Observable發(fā)送的數(shù)據(jù)和函數(shù)的計(jì)算結(jié)果,作為下次計(jì)算的參數(shù),并輸出最后的結(jié)果。reduce與我們前面了解過的scan操作符很類似,只是scan會(huì)輸出每次計(jì)算的結(jié)果,而reduce只輸出最后的結(jié)果。

/**
     * reduce
     */
    private void reduceTest(){
        ArrayList<Integer> list = new ArrayList<>();
        for(int i=0; i<10;i++){
            list.add(2);
        }
        Observable.from(list).reduce(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) {
                log("reduce: " + integer);
            }
        });
    }
結(jié)果:
reduce: 1024

3.8.4 collect

collect操作符類似于reduce,但是二者目的不同。collect操作符用來將源Observable發(fā)送的數(shù)據(jù)收集到一個(gè)數(shù)據(jù)結(jié)構(gòu)里面,最后將這個(gè)數(shù)據(jù)結(jié)構(gòu)整個(gè)發(fā)送出來。collect操作符需要使用兩個(gè)函數(shù)作為參數(shù):
-第一個(gè)函數(shù)會(huì)產(chǎn)生收集數(shù)據(jù)結(jié)構(gòu)的函數(shù)
-第二個(gè)函數(shù)會(huì)將上面函數(shù)產(chǎn)生的數(shù)據(jù)結(jié)構(gòu)和源Observable發(fā)送的數(shù)據(jù)作為參數(shù),且這個(gè)函數(shù)會(huì)將源Observable發(fā)送的數(shù)據(jù)存入到這個(gè)數(shù)據(jù)結(jié)構(gòu)中。

/**
     * collect
     */
    private void collectTest(){
        ArrayList<Integer> list = new ArrayList<>();
        for(int i=0; i<10;i++){
            list.add(i);
        }
        Observable.from(list).collect(new Func0<ArrayList<Integer>>() {
            @Override
            public ArrayList<Integer> call() {
                return new ArrayList<>();
            }
        }, new Action2<ArrayList<Integer>, Integer>() {
            @Override
            public void call(ArrayList<Integer> integers, Integer integer) {
                integers.add(integer);
            }
        }).subscribe(new Action1<ArrayList<Integer>>() {
            @Override
            public void call(ArrayList<Integer> integers) {
                log("collect: " + integers);
            }
        });
    }
結(jié)果:
collect: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 一、RxJava操作符概述 RxJava中的操作符就是為了提供函數(shù)式的特性,函數(shù)式最大的好處就是使得數(shù)據(jù)處理簡潔易...
    測(cè)天測(cè)地測(cè)空氣閱讀 685評(píng)論 0 1
  • 記錄RxJava操作符,方便查詢(2.2.2版本) 英文文檔地址:http://reactivex.io/docu...
    凌云飛魚閱讀 1,051評(píng)論 0 0
  • 一、RxJava操作符概述 RxJava中的操作符就是為了提供函數(shù)式的特性,函數(shù)式最大的好處就是使得數(shù)據(jù)處理簡潔易...
    BrotherChen閱讀 1,782評(píng)論 0 10
  • 一、RxJava操作符概述 RxJava中的操作符就是為了提供函數(shù)式的特性,函數(shù)式最大的好處就是使得數(shù)據(jù)處理簡潔易...
    無求_95dd閱讀 3,495評(píng)論 0 21
  • 注:只包含標(biāo)準(zhǔn)包中的操作符,用于個(gè)人學(xué)習(xí)及備忘參考博客:http://blog.csdn.net/maplejaw...
    小白要超神閱讀 2,376評(píng)論 2 8

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