RX操作符之算术和聚合操作(averageInteger、min、max、count、sum、contact、reduce、collect)

一、averageInteger

计算Observable的发射数字的平均值。Average操作符操作符一个发射数字的Observable,并发射单个值:原始Observable发射的数字序列的平均值。这个操作符不包含在RxJava核心模块中,它属于不同的rxjava-math模块。它被实现为四个操作符:averageDoubleaverageFloataverageIntegeraverageLong

 //使用MathObservable需要在build.gradle中添加compile 'io.reactivex:rxjava-math:1.0.0'
        Observable<Integer> averageObservable =
                MathObservable.averageInteger(Observable.just(11, 2, 3, 4, 5));

        Subscriber<Integer> subscriber = new Subscriber<Integer>() {
            @Override
            public void onNext(Integer v) {
                Log.e(TAG, "onNext................." + v);

            }

            @Override
            public void onCompleted() {
                Log.e(TAG, "onCompleted.................");
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError.....................");
            }
        };

        averageObservable.subscribe(subscriber);
运行结果:



二、min

求发射的Observable中的最小值

//使用MathObservable需要在build.gradle中添加compile 'io.reactivex:rxjava-math:1.0.0'
        Observable<Integer> averageObservable =
                MathObservable.min(Observable.just(11, 2, 3, 4, 5));

        Subscriber<Integer> subscriber = new Subscriber<Integer>() {
            @Override
            public void onNext(Integer v) {
                Log.e(TAG, "onNext................." + v);

            }

            @Override
            public void onCompleted() {
                Log.e(TAG, "onCompleted.................");
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError.....................");
            }
        };

        averageObservable.subscribe(subscriber);
运行结果:



三、max

发射的observable中的最大值

//使用MathObservable需要在build.gradle中添加compile 'io.reactivex:rxjava-math:1.0.0'
        Observable<Integer> averageObservable =
                MathObservable.max(Observable.just(11, 2, 3, 4, 5));


        Subscriber<Integer> subscriber = new Subscriber<Integer>() {
            @Override
            public void onNext(Integer v) {
                Log.e(TAG, "onNext................." + v);

            }

            @Override
            public void onCompleted() {
                Log.e(TAG, "onCompleted.................");
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError.....................");
            }
        };

        averageObservable.subscribe(subscriber);

运行结果:


四、count

计算Observable所发射的数据的数量

 Observable<Integer> averageObservable = Observable.just(11, 2, 3, 4, 5).count();

        Subscriber<Integer> subscriber = new Subscriber<Integer>() {
            @Override
            public void onNext(Integer v) {
                Log.e(TAG, "onNext................." + v);

            }

            @Override
            public void onCompleted() {
                Log.e(TAG, "onCompleted.................");
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError.....................");
            }
        };

        averageObservable.subscribe(subscriber);

运算结果:


五、sum

Observable所发射的数据的和.Sum操作符操作一个发射数值的Observable,仅发射单个值:原始Observable所有数值的和。

RxJava的实现是sumDoublesumFloatsumIntegersumLong,它们不是RxJava核心模块的一部分,属于rxjava-math模块。

//使用MathObservable需要在build.gradle中添加compile 'io.reactivex:rxjava-math:1.0.0'
        Observable<Integer> averageObservable = MathObservable.sumInteger(Observable.just(11, 2, 3, 4, 5));

        Subscriber<Integer> subscriber = new Subscriber<Integer>() {
            @Override
            public void onNext(Integer v) {
                Log.e(TAG, "onNext................." + v);

            }

            @Override
            public void onCompleted() {
                Log.e(TAG, "onCompleted.................");
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError.....................");
            }
        };

        averageObservable.subscribe(subscriber);

运行结果:


六、contact

不交错的发射两个或多个Observable的发射物。Concat操作符连接多个Observable的输出,就好像它们是一个Observable,第一个Observable发射的所有数据在第二个Observable发射的任何数据前面,以此类推。直到前面一个Observable终止,Concat才会订阅额外的一个Observable。注意:因此,如果你尝试连接一个"热"Observable(这种Observable在创建后立即开始发射数据,即使没有订阅者),Concat将不会看到也不会发射它之前发射的任何数据。在ReactiveX的某些实现中有一种ConcatMap操作符(名字可能叫concat_allconcat_map,concatMapObserverforforIn/for_inmapcatselectConcatselectConcatObserver),他会变换原始Observable发射的数据到一个对应的Observable,然后再按观察和变换的顺序进行连接操作。StartWith操作符类似于Concat,但是它是插入到前面,而不是追加那些Observable的数据到原始Observable发射的数据序列。Merge操作符也差不多,它结合两个或多个Observable的发射物,但是数据可能交错,而Concat不会让多个Observable的发射物交错。

Observable<Integer> observable = Observable.concat(Observable.just(1,2,3,4,5),Observable.just(6,7,8,9,10));

        Subscriber<Integer> subscriber = new Subscriber<Integer>() {
            @Override
            public void onNext(Integer v) {
                Log.e(TAG, "onNext................." + v);

            }

            @Override
            public void onCompleted() {
                Log.e(TAG, "onCompleted.................");
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError.....................");
            }
        };

        observable.subscribe(subscriber);
运行结果:




七、reduce

按顺序对Observable发射的每项数据应用一个函数并发射最终的值。Reduce操作符对原始Observable发射数据的第一项应用一个函数,然后再将这个函数的返回值与第二项数据一起传递给函数,以此类推,持续这个过程知道原始Observable发射它的最后一项数据并终止,此时Reduce返回的Observable发射这个函数返回的最终值。在其它场景中,这种操作有时被称为累积聚集压缩折叠注射等。

注:不建议使用reduce收集发射的数据到一个可变的数据结构,那种场景你应该使用collect

 Observable<Integer> observable = Observable.just(1,2,3,4,5);

        Subscriber<Integer> subscriber = new Subscriber<Integer>() {
            @Override
            public void onNext(Integer v) {
                Log.e(TAG, "onNext................." + v);

            }

            @Override
            public void onCompleted() {
                Log.e(TAG, "onCompleted.................");
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError.....................");
            }
        };

        observable
                .reduce(new Func2<Integer, Integer, Integer>() {
                    @Override
                    public Integer call(Integer integer1, Integer integer2) {

                            Log.e(TAG, "integer1:"+integer1+"..............integer2:"+integer2);
                        return integer1+integer2;
                    }
                })
                .subscribe(subscriber);

运行结果:


八、collect

将Observable的数据收集到一个数据结构中。collectreduce类似,但它的目的是收集原始Observable发射的所有数据到一个可变的数据结构,collect生成的这个Observable会发射这项数据。它需要两个参数:

  1. 一个函数返回可变数据结构
  2. 另一个函数,当传递给它这个数据结构和原始Observable发射的数据项时,适当地修改数据结构。

Observable<Integer> observable = Observable.just(1,2,3,4,5);

        Func0<ArrayList<Integer>> stateFactory = new Func0<ArrayList<Integer>>() {
            @Override
            public ArrayList<Integer> call() {
                return new ArrayList<Integer>();
            }
        };

        Action2<ArrayList<Integer>, Integer> collector = new Action2<ArrayList<Integer>, Integer>() {

            @Override
            public void call(ArrayList<Integer> integers, Integer integer) {
                Log.e(TAG,"integer:"+integer+"..................");
                integers.add(integer);
            }
        } ;

        Subscriber<ArrayList<Integer>> subscriber = new Subscriber<ArrayList<Integer>>() {
            @Override
            public void onNext(ArrayList<Integer> v) {
                Log.e(TAG, "onNext................." + v.toString());

            }

            @Override
            public void onCompleted() {
                Log.e(TAG, "onCompleted.................");
            }

            @Override
            public void onError(Throwable e) {
                Log.e(TAG, "onError.....................");
            }
        };

        observable
                .collect(stateFactory,collector)
                .subscribe(subscriber);
运行结果:



九、toList

收集原始Observable发射的所有数据到一个列表,然后返回这个列表

十、toSortedList

 收集原始Observable发射的所有数据到一个有序列表,然后返回这个列表

十一、toMap

将序列数据转换为一个Map,Map的key是根据一个函数计算的

十二、toMultiMap

将序列数据转换为一个列表,同时也是一个Map,Map的key是根据一个函数计算的



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值