美文网首页
RxJava基础八-聚合操作符

RxJava基础八-聚合操作符

作者: 清水杨杨 | 来源:发表于2019-05-02 16:41 被阅读0次

    此篇内容均是来自书籍《RxJava响应式编程》李衍顺 著

    3.8 聚合操作符

    3.8.1 concat

    concat操作符将多个Observable结合成一个Observable并发送数据,并且严格按照先后顺序发送数据,即前一个Observable数据没有发送完时,后面的Observable是不能发送数据的。

    有两个操作符与concat操作符很类似,他们分别是:
    -startWith:仅仅是在前面插上一个Observable或者一些数据,并且先发送插入的内容
    -merge:其发送的数据是无序的,也就是说被组合的多个Observable是可以自由发送数据的,而不用管其它的Observable的状态。

    /**
         * 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);
                        }
                    });
        }
    结果:
    concat: 1
    concat: 2
    concat: 3
    concat: 7
    concat: 8
    concat: 9
    concat: 4
    concat: 5
    concat: 6
    

    3.8.2 count

    count操作符用来统计源Observable发送了多少个数据,最后将数目发送出来。如果源Observable发送错误,则会将错误直接报出来。在源Observable停止发送前,count是不会发送统计数据的

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

    3.8.3 reduce

    reduce操作符应用一个函数接收Observable发送的数据和函数的计算结果,作为下次计算的参数,并输出最后的结果。reduce与我们前面了解过的scan操作符很类似,只是scan会输出每次计算的结果,而reduce只输出最后的结果。

    /**
         * 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);
                }
            });
        }
    结果:
    reduce: 1024
    

    3.8.4 collect

    collect操作符类似于reduce,但是二者目的不同。collect操作符用来将源Observable发送的数据收集到一个数据结构里面,最后将这个数据结构整个发送出来。collect操作符需要使用两个函数作为参数:
    -第一个函数会产生收集数据结构的函数
    -第二个函数会将上面函数产生的数据结构和源Observable发送的数据作为参数,且这个函数会将源Observable发送的数据存入到这个数据结构中。

    /**
         * 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);
                }
            });
        }
    结果:
    collect: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    

    相关文章

      网友评论

          本文标题:RxJava基础八-聚合操作符

          本文链接:https://www.haomeiwen.com/subject/elinnqtx.html