RxJava2最全面、最详细的讲解(四)

前言:及时当勉励,岁月不饶人,生命不止,奋斗不息,比自己差的人还没有放弃,比自己强的人还在努力!

一、概述

RxJava2在第一篇文章作了详细的介绍,第二篇文章中讲解了RxJava的变换操作符,组合操作符,合并操作符;第三篇讲解了延迟、do相关、错误处理等操作符的使用,如果英文比较好而且有兴趣的可以到官网学习:ReactiveX的官方网站。下面开始继续讲解RxJava2的其他用法。(链接和源码在文章最后给出)

二、过滤操作符

1.filter()

filter()对源Observable(被观察者)产生的结果按照执行条件过虑,只有满足条件才会提交给观察者。

Observable.just(1, 2, 3, 4, 5, 6, 7, 8, 9)
            .filter(new Predicate<Integer>() {
        @Override
        public boolean test(Integer integer) throws Exception {
            //条件:能否被2整除
            return integer % 2 == 0;
        }
    }).subscribe(new Observer<Integer>() {
        @Override
        public void onSubscribe(Disposable d) {
            Log.e(TAG, "filter:onSubscribe == 订阅");
        }

        @Override
        public void onNext(Integer integer) {
            Log.e(TAG, "filter:apply == 事件" + integer);
        }

        @Override
        public void onError(Throwable e) {
            Log.e(TAG, "filter:onError == " + e.getMessage());
        }

        @Override
        public void onComplete() {
            Log.e(TAG, "filter:onComplete == ");
        }
    });

例子中放1~9共9个数据,在filter回调方法中添加条件判断,满足则将结果发送给观察者,满足能被2整除的数是:2,4,6,8;打印数据如下:

2.ofType()

ofType()根据类型对源Observable(被观察者)产生的结果进行过滤,只有满足条件才会提交给观察者Observer。ofType()filter()类似,但是ofType()是根据类型对结果进行过滤的。

Observable.just(1, "大闸蟹", true, 0.23f, 5L, new Goods("商品名"))
            .ofType(Goods.class).subscribe(new Observer<Goods>() {
        @Override
        public void onSubscribe(Disposable d) {
            Log.e(TAG, "ofType:onSubscribe == 订阅");
        }

        @Override
        public void onNext(Goods goods) {
            Log.e(TAG, "ofType:onNext == " + goods.getName());
        }

        @Override
        public void onError(Throwable e) {
            Log.e(TAG, "ofType:onError == " + e.getMessage());
        }

        @Override
        public void onComplete() {
            Log.e(TAG, "ofType:onComplete == ");
        }
    });

这里事件队列有多种类型,int、String、Boolean、float、Long还有自定义的实体类,过滤实体类的数据Goods.calss,打印数据如下:

3.elementAt()

elementAt()把源Observable(被观察者)生产的结果中,只提交索引指示的结果给Observer(观察者)。注意:索引从0开始。

Observable.just(1, 2, 3, 4, 5, 6, 7, 8, 9)
             .elementAt(7)
             .subscribe(new Consumer<Integer>() {
        @Override
        public void accept(Integer integer) throws Exception {
            Log.e(TAG, "elementAt:accept == " + integer);
        }
    });

这里打印索引(索引从0开始计算)为7的数据:8,打印数据如下:

4.distinct()

distinct():对源Observable的结果进行过滤,去掉重复出现的结果,只输出不重复的结果给Observer观察者,简单来说就是去重。

Observable.just(1, 2, 2, 3, 4, 4, 4)
             .distinct()
                .subscribe(new Observer<Integer>() {
        @Override
        public void onSubscribe(Disposable d) {
            Log.e(TAG, "distinct:onSubscribe == 订阅");
        }

        @Override
        public void onNext(Integer integer) {
            Log.e(TAG, "distinct:onNext == " + integer);

        }

        @Override
        public void onError(Throwable e) {
            Log.e(TAG, "distinct:onError == " + e.getMessage());
        }

        @Override
        public void onComplete() {
            Log.e(TAG, "distinct:onComplete == ");
        }
    });

这里的事件队列中,2和4皆有多个重复的数据,如果过滤重复的那么只会出现:1,2,3,4,打印数据如下:

5. debounce()

debounce():只接收到倒计时时间外的源Observable(被观察者)发出的事件,每次发送的事件都会重置倒计时时间。

 Observable.create(new ObservableOnSubscribe<Integer>() {
        @Override
        public void subscribe(ObservableEmitter<Integer> e) {
            try {//产生结果的时间间隔为0,100,200……900毫秒,每次发送的数据为0,1,2……9
                for (int i = 0; i < 10; i++) {
                    e.onNext(i);
                    Thread.sleep(i * 100);
                }
            } catch (Exception exception) {
                e.onError(exception);
            }
        }
    }).debounce(300, TimeUnit.MILLISECONDS)
                .subscribe(new Observer<Integer>() {
        @Override
        public void onSubscribe(Disposable d) {
            Log.e(TAG, "debounce:onSubscribe == 订阅");
        }

        @Override
        public void onNext(Integer integer) {
            Log.e(TAG, "debounce:onNext ==" + integer);
        }

        @Override
        public void onError(Throwable e) {
            Log.e(TAG, "debounce:onError == " + e.getMessage());
        }

        @Override
        public void onComplete() {
            Log.e(TAG, "debounce:onComplete == ");
        }
    });

这里每隔0,100,200……900毫秒发送的数据分别为0,1,2……9,debounce()中指定倒计时的时间为300毫秒,只接受到300毫秒后的结果,打印数据如下:

6.first()

first():将源Observable(被观察者)产生的第一次结果提交给Observer(被观察者),first()可以用elementAt(0)take(1)替代。

  • first(T defaultItem):defaultItem表示默认值。
  Observable.just(1,2,3)
            .first(0)//defaultItem:默认值
                .subscribe(new Consumer<Integer>() {
        @Override
        public void accept(Integer integer) throws Exception {
            Log.e(TAG, "first:accept ==" + integer);
        }
    });

这里发送1,2,3,接受到第一个结果为:1,如果接受不到数据则直接输出默认值,这里设置的默认值为0,打印数据如下:

7.last()

last():表示将源Observable(被观察者)产生的最后一次结果提交给Observer(被观察者),与first()相对应,可以用takelast()替代。

Observable.just(1, 2, 3, 4)
        .last(-1)
        .subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                Log.e(TAG, "last:accept ==" + integer);
              }
        });

发出4个事件,返回最后一个事件的结果:4,默认值为-1(在获取不到结果的时候返回),打印结果如下:

8.skip()

skip():针对源Observable(被观察者)产生的结果跳过N个不处理,而把后面的结果提交给Observer(观察者)处理。与takeLast()类似。

Observable.just(1, 2, 3, 4, 5, 6, 7)
         .skip(3)
         .subscribe(new Observer<Integer>() {
        @Override
        public void onSubscribe(Disposable d) {
            Log.e(TAG, "skip:onSubscribe == 订阅");
        }

        @Override
        public void onNext(Integer integer) {
            Log.e(TAG, "skip:onNext ==" + integer);
        }

        @Override
        public void onError(Throwable e) {
            Log.e(TAG, "skip:onError == " + e.getMessage());
        }

        @Override
        public void onComplete() {
            Log.e(TAG, "skip:onComplete == ");
        }
    });

这里发送7个事件,跳过前三个,打印数据如下:

9.take()

take():源Observable(被观察者)产生的结果,把前面的n个提交给Observer(观察者)处理,后面的不做处理。与skip()相对。

 Observable.just(1, 2, 3, 4, 5, 6, 7)
         .take(3)
         .subscribe(new Observer<Integer>() {
        @Override
        public void onSubscribe(Disposable d) {
            Log.e(TAG, "take:onSubscribe == 订阅");
        }

        @Override
        public void onNext(Integer integer) {
            Log.e(TAG, "take:onNext ==" + integer);
        }

        @Override
        public void onError(Throwable e) {
            Log.e(TAG, "take:onError == " + e.getMessage());
        }

        @Override
        public void onComplete() {
            Log.e(TAG, "take:onComplete == ");
        }
    });

这里发送了7个事件,只提交前面三个数据给Observer,打印数据如下:

takeLast()表示把最后的n项结果提交给Observer,与skip()类似,这里就不举例了。

这里对过滤操作符做一个简单的总结:

创建类型作用备注使用场景
过滤操作符filter()按照指定的条件(自定义)对被观察者发出的结果进行过滤,再提交给被观察者在回调方法中实现规则过滤

需要过滤或者选择某一步操作

ofType()根据指定的数据类型对被观察者发出的结果进行过滤,再提交给被观察者参数传入对结果过滤的类型
elementAt()将指定索引被观察者发出的事件提交给观察者,索引为0参数传入索引
distinct()去重,去掉被观察者产生的重复的结果,将不重复的提交给观察者
debounce()只接收到倒计时时间外的被观察者发出的事件,每个事件发出时会重置倒计时时间。参数传入每个事件的倒计时时间
first()将被观察者产生的第一个结果提交给被观察者处理
last()将被观察者产生的最后一个结果提交给观察者处理
skip()跳过前n个被观察者产生的结果,将后面的提交给观察者处理参数传入指定跳过的数量
take()将前n个被观察者产生的结果提交给观察者处理,其他的不做处理参数传入指定执行的数量

三、其他他操作符

1.groupBy()

groupBy():对于源Observable(被观察者)产生的结果进行分组,形成一个类型为GroupedObservable的结果集,GroupedObservable存在一个方法为getKey(),通过该方法获取结果集的key值。

注意:由于结果集GroupedObservable把分组结果缓存起来,如果对每个GroupedObservable都不进行处理(既不订阅也没有别的操作)就有可能出现内存泄漏,如果某个GroupedObservable不处理那可以使用take(0)处理掉。

//每隔一秒发送一次事件,一共发送五次
Observable.interval(1, TimeUnit.SECONDS)
            .take(5)
            .groupBy(new Function<Long, Object>() {
        @Override
        public Object apply(Long aLong) throws Exception {
            return aLong * 10;
        }
    }).subscribe(new Observer<GroupedObservable<Object, Long>>() {
        @Override
        public void onSubscribe(Disposable d) {
            Log.e(TAG, "take:onSubscribe == 订阅");
        }

        @Override
        public void onNext(GroupedObservable<Object, Long> objectLongGroupedObservable) {
            Log.e(TAG, "take:onNext == key:" + objectLongGroupedObservable.getKey());
        }

        @Override
        public void onError(Throwable e) {
            Log.e(TAG, "take:onError == " + e.getMessage());
        }

        @Override
        public void onComplete() {
            Log.e(TAG, "take:onComplete == ");
        }
    });

这里每隔1秒发送一次事件,一共发送五次,key值*10处理,打印结果如下:

2.cast()

cast():主要是用于类型转换的,传入的参数类型为.class,如果源Observable(被观察者)的源类型不能转为指定的.class,  则会抛出ClassCastException类型转换异常。

 Observable.just(1, 2, 3, 4, 5, 6)
         .cast(Integer.class)
         .subscribe(new Observer<Integer>() {
        @Override
        public void onSubscribe(Disposable d) {
            Log.e(TAG, "cast:onSubscribe == 订阅");
        }

        @Override
        public void onNext(Integer integer) {
            Log.e(TAG, "cast:onNext == " + integer);
        }

        @Override
        public void onError(Throwable e) {
            Log.e(TAG, "cast:onError == " + e.getMessage());
        }

        @Override
        public void onComplete() {
            Log.e(TAG, "cast:onComplete == ");
        }
    });

这里发出1~6个事件,打印数据如下:

3.scan()

scan():通过遍历源Observable(被观察者)产生的结果,依次每个结果按照指定的规则进行计算,计算后的结果作为下一项迭代的参数,每一次迭代项都会把计算结果输出给订阅者。简单来说就是每次计算后的结果都会用于下一次计算。

 Observable.just(1, 2, 3)
         .scan(new BiFunction<Integer, Integer, Integer>() {
        @Override
        public Integer apply(Integer sum, Integer integer) throws Exception {
            //sum是上次计算的记过,integer是本次计算的参数
            Log.e(TAG, "scan:apply == sum + integer = " + sum + " + " + integer);
            return sum + integer;
        }
    }).subscribe(new Observer<Integer>() {
        @Override
        public void onSubscribe(Disposable d) {
            Log.e(TAG, "scan:onSubscribe == 订阅");
        }

        @Override
        public void onNext(Integer integer) {
            Log.e(TAG, "scan:onNext == " + integer);
        }

        @Override
        public void onError(Throwable e) {
            Log.e(TAG, "scan:onError == " + e.getMessage());
        }

        @Override
        public void onComplete() {
            Log.e(TAG, "scan:onComplete == ");
        }
    });

这里只有1,2,3共三个事件,第一次计算:0+1;第二次计算:第一次计算的结果+第二个参数,即:1+2=3;第三次计算:上一次计算的结果+第三个参数,即:3+3=6,打印数据如下:

4.join()

join():把两个Observable(被观察者)产生的结果进行合并,合并成的结果组成一个新的Observable,可以控制每个Observable产生结果的生命周期,在每个结果的生命周期内,可以与另一个Observable产生的结果按照一定的规则进行合并。类似combineLatest()

join()的用法如下:

ObservableA.join(ObservableB, ObservableA产生结果的生命周期控制函数,ObservableB产生结果的生命周期控制函数, ObservableA与ObservableB结果合并规则函数)

    //每隔一秒,产生0,5,10,15,20事件队列
    Observable<Long> observable1 = Observable.interval(0,1000, TimeUnit.MILLISECONDS)
            .map(new Function<Long, Long>() {
                @Override
                public Long apply(Long aLong) throws Exception {
                    return aLong * 5;
                }
            }).take(5);

    //延时500毫秒,每隔一秒,产生0,10,20,30,40 事件队列
    Observable<Long> observable2 = Observable.interval(500, 1000,TimeUnit.MILLISECONDS)
            .map(new Function<Long, Long>() {
                @Override
                public Long apply(Long aLong) {
                    return aLong * 10;
                }
            }).take(5);


    observable1.join(observable2, new Function<Long, ObservableSource<Long>>() {
        @Override
        public ObservableSource<Long> apply(Long aLong) {
            //使Observable延时600毫秒执行(控制observable1的生命周期)
            return Observable.just(aLong).delay(600,TimeUnit.MILLISECONDS);
        }
    }, new Function<Long, ObservableSource<Long>>() {
        @Override
        public ObservableSource<Long> apply(Long aLong) {
            //使Observable延时600毫秒执行(控制observable2的生命周期)
            return Observable.just(aLong).delay(600,TimeUnit.MILLISECONDS);
        }
    }, new BiFunction<Long, Long, Long>() {
        @Override
        public Long apply(Long aLong, Long aLong2) {
            //合并逻辑
            Log.e(TAG, "BiFunction:apply == aLong1 + aLong2:" + aLong + " + " + aLong2);
            return aLong + aLong2;
        }
    }).subscribe(new Observer<Long>() {
        @Override
        public void onSubscribe(Disposable d) {
            Log.e(TAG, "join:onSubscribe == 订阅");
        }

        @Override
        public void onNext(Long aLong) {
            Log.e(TAG, "join:onNext == " + aLong);
        }

        @Override
        public void onError(Throwable e) {
            Log.e(TAG, "join:onError == " + e.getMessage());
        }

        @Override
        public void onComplete() {
            Log.e(TAG, "join:onComplete == ");
        }
    });

Observable1每隔1秒产生0,5,10,15,20 事件队列,Observable2延时0.5秒,每隔1秒产生0,10,20,30,40 事件队列,第一个Function函数控制Observable1结果的生命周期,第二个Function函数控制Observable2结果的生命周期,都做了延时600毫秒发送,第三个BiFunction函数整合Observable1,Observable2产生的结果,打印数据如下:

5.groupJoin()

groupJoin():类似于join(),也是把两个Observable产生的结果进行合并,组成一个新的Observable,可以控制每个Observable产生结果的生命周期,在每个结果的生命周期内,与另一个Observable的结果进行合并按照一定的规则进行合并。与join()不同的是第四个参数传入的函数不一致。

   //每隔1秒,产生0,5,10,15,20事件队列
    Observable<Long> observable1 = Observable.interval(0, 1000, TimeUnit.MILLISECONDS)
            .map(new Function<Long, Long>() {
                @Override
                public Long apply(Long aLong) {
                    return aLong * 5;
                }
            }).take(5);

    //延迟0.5秒,每秒产生0,10,20,30,40事件队列
    Observable<Long> observable2 = Observable.interval(500, 1000, TimeUnit.MILLISECONDS)
            .map(new Function<Long, Long>() {
                @Override
                public Long apply(Long aLong) {
                    return aLong * 10;
                }
            }).take(5);

        observable1.groupJoin(observable2, new Function<Long, ObservableSource<Long>>() {
        @Override
        public ObservableSource<Long> apply(Long aLong) {
            //使Observable延时1600毫秒执行(控制observable1的生命周期)
            return Observable.just(aLong).delay(1600, TimeUnit.MILLISECONDS);
        }
    }, new Function<Long, ObservableSource<Long>>() {
        @Override
        public ObservableSource<Long> apply(Long aLong) {
            //使Observable延时600毫秒执行(控制observable2的生命周期)
            return Observable.just(aLong).delay(600, TimeUnit.MILLISECONDS);
        }
    }, new BiFunction<Long, Observable<Long>, Observable<Long>>() {
        @Override
        public Observable<Long> apply(final Long aLong, Observable<Long> longObservable) {
            return longObservable.map(new Function<Long, Long>() {
                @Override
                public Long apply(Long aLong2) {
                    //合并逻辑
                    Log.e(TAG, "BiFunction:apply == aLong1 + aLong2:" + aLong + " + " + aLong2);
                    return aLong + aLong2;
                }
            });
        }
    }).subscribe(new Observer<Observable<Long>>() {
        @Override
        public void onSubscribe(Disposable d) {
            Log.e(TAG, "groupJoin:onSubscribe == 订阅");
        }

        @Override
        public void onNext(Observable<Long> longObservable) {
            longObservable.subscribe(new Consumer<Long>() {
                @Override
                public void accept(Long aLong) {
                    Log.e(TAG, "groupJoin:onNext == " + aLong);
                }
            });
        }

        @Override
        public void onError(Throwable e) {
            Log.e(TAG, "groupJoin:onError == " + e.getMessage());
        }

        @Override
        public void onComplete() {
            Log.e(TAG, "groupJoin:onComplete == ");
        }
    });

Observable1每隔1秒产生0,5,10,15,20事件队列,Observable2延时0.5秒,每隔一秒产生0,10,20,30,40事件队列,第一个Function函数控制Observable1结果的生命周期,第二个Function函数控制Observable2结果的生命周期,第三个函数BiFunction整合Observable1和Observable2的结果,返回的结果是新的Observable。打印结果如下:

我们来对这部分的操作符做个小结:

创建类型作用备注
过滤操作符groupBy()对于源Observable(被观察者)产生的结果进行分组,形成一个类型为GroupedObservable的结果集,存在一个方法为getKey(),通过该方法获取结果集的key值如果事件结果没有处理,那么take()处理一下,否则会内存泄漏
cast()用于类型转换,将源Observable的源类型转为指定的.class如果类型不正确则会抛出转换异常。
scan()遍历源Observable产生的结果,依次每个结果按照指定的规则进行计算,计算后的结果作为下一项迭代的参数,每一次迭代项都会把计算结果输出给订阅者。每次计算的结果用于下次计算
join()把两个Observable产生的结果进行合并,合并结果组成一个新的Observable,可以控制每个Observable产生结果的生命周期,在每个结果的生命周期内,可以与另一个Observable产生的结果按照一定的规则进行合并合并结果产生新的Observable
groupJoin()类似上述,第三个参数不一致,返回新的Observable处理

源码地址:https://github.com/FollowExcellence/Rxjava_Retrofit

点关注,不迷路


好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是人才。

我是suming,感谢各位的支持和认可,您的点赞、评论、收藏【一键三连】就是我创作的最大动力,我们下篇文章见!

如果本篇博客有任何错误,请批评指教,不胜感激 !

要想成为一个优秀的安卓开发者,这里有必须要掌握的知识架构,一步一步朝着自己的梦想前进!Keep Moving!

相关文章:

Retrofit2详解和使用(一)

  • Retrofit2的介绍和简单使用

OKHttp3的使用和详解

  • OKHttp3的用法介绍和解析

OKHttp3源码详解

  • 从源码角度解释OKHttp3的关键流程和重要操作

RxJava2详解(一)

  • 详细介绍了RxJava的使用(基本创建、快速创建、延迟创建等操作符)

RxJava2详解(二)

  • RxJava转换、组合、合并等操作符的使用

RxJava2详解(三)

  • RxJava延迟、do相关、错误处理等操作符的使用

RxJava2详解(四)

  • RxJava过滤、其他操作符的使用

上述几篇都是android开发必须掌握的,后续会完善其他部分!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值