面试神器第二弹:Rxjava熟悉——操作符

时间:2021-09-15 16:55:59

上期简单讲了Rxjava的入门,方便大家认识Rxjava,这期带大家了解Rxjava,认识Rxjava的更多特性

Rxjava操作符

Rxjava操作符就是各种方法,每种方法能够帮助我们处理一种情况,Rxjava的强大也就在于这些方法的使用。下面大家认识一下几个比较常用的操作符(方法)
面试神器第二弹:Rxjava熟悉——操作符

Observable.create:

面试神器第二弹:Rxjava熟悉——操作符
这是最简单操作符,用于创建一个Observable(被观察者),该方法在上一期中已经讲了,忘了的同学请点击链接查看,原理图如下:

Observable.from:

这个操作符的作用是 将一个Iterable, 一个Future, 或者一个数组,内部通过代理的方式转换成一个Observable,并且一次发射到观察者(Observer、Subscription)中的回调中!如下例:

Observable.from(files)
    .flatMap(new Func1<File, Observable<File>>() {
        @Override
        public Observable<File> call(File file) {
            return Observable.from(file.listFiles());
        }
    })
Observable.just:

将一个或多个对象转换成发射这个或这些对象的一个Observable
当一个对象的时候的流程图如下:
面试神器第二弹:Rxjava熟悉——操作符

当多个对象的时候流程图如下:

面试神器第二弹:Rxjava熟悉——操作符

创建的Observable会发射到观察者中去,如果多个对象会依次发射,图中表现很明显。
使用方法如下:

Observable.just(file1, file2...)
    .flatMap(new Func1<File, Observable<File>>() {
        @Override
        public Observable<File> call(File file) {
            return Observable.from(file.listFiles());
        }
    })

最多支持10个参数,使用者可以在源码中查看

Observable.empty/Observable.error/Observable.never:
  • empty: 创建一个什么都不做直接通知完成的
  • error: 创建一个什么都不做直接通知错误的Observable
  • never: 创建一个什么都不做的Observable
    Observable observable1 = Observable.empty();//直接调用onCompleted。
    Observable observable2 = Observable.error(new RuntimeException());//直接调用onError,常用于自定义异常
    Observable observable3 = Observable.never();//什么都不做

Observable.merge/zip/startWith/concat

  • merge:将多个Observable合并为一个。merge不是按照添加顺序连接,而是按照时间线来连接。其中mergeDelayError将异常延迟到其它没有错误的Observable发送完毕后才发射。而merge则是一遇到异常将停止发射数据,发送onError通知。
    面试神器第二弹:Rxjava熟悉——操作符

    • zip:使用一个函数组合多个Observable发射的数据集合,然后再发射这个结果。如果多个Observable发射的数据量不一样,则以最少的Observable为标准进行压合。内部通过OperatorZip进行压合。
      面试神器第二弹:Rxjava熟悉——操作符
Observable<Integer>  observable1=Observable.just(1,2,3,4);
Observable<Integer>  observable2=Observable.just(4,5,6);
    Observable.zip(observable1, observable2, new Func2<Integer, Integer, String>() {
        @Override
        public String call(Integer item1, Integer item2) {
            return item1+"and"+item2;
        }
    }).subscribe(item->Log.d("JG",item)); //1and4,2and5,3and6
  • concat: 按顺序连接多个Observables。需要注意的是Observable.concat(a,b)等价于a.concatWith(b)。
    面试神器第二弹:Rxjava熟悉——操作符
    Observable<Integer> observable1=Observable.just(1,2,3,4);
    Observable<Integer>  observable2=Observable.just(4,5,6);

    Observable.concat(observable1,observable2)
            .subscribe(item->Log.d("JG",item.toString()));//1,2,3,4,4,5,6
  • startWith: 在数据序列的开头增加一项数据。startWith的内部也是调用了concat
    面试神器第二弹:Rxjava熟悉——操作符
 Observable.just(1,2,3,4,5)
            .startWith(6,7,8)
    .subscribe(item->Log.d("JG",item.toString()));//6,7,8,1,2,3,4,5

Observable.filter/distinct

  • filter 过滤数据。找到符合你规则的数据。
    面试神器第二弹:Rxjava熟悉——操作符
  Observable.just(3,4,5,6)
            .filter(new Func1<Integer, Boolean>() {
                @Override
                public Boolean call(Integer integer) {
                    return integer>0;
                }
            }).subscribe(item->Log.d("JG",item.toString())); //5,6
  • distinct:过滤重复数据,内部通过OperatorDistinct实现。
 Observable.just(3,4,5,6,3,3,4,9)
       .distinct()
      .subscribe(item->Log.d("JG",item.toString())); //3,4,5,6,9

更多的操作符可以去官网查看文档:链接传送门
其实,读懂上面的几个操作符,熟悉上面的图片上的流程基本能理解Rxjava的操作符。这些都只是简单了解,下期我们为大家介绍Rxjava核心的部分—–异步!

欢迎关注公众号:码老板
面试神器第二弹:Rxjava熟悉——操作符