Rxjava操作符

创建型

  1. create

create操作符是所有创建型操作符的“根”,也就是说其他创建型操作符最后都是通过create操作符来创建Observable的.

Observable.create(new Observable.OnSubscribe() {
            @Override
            public void call(Subscriber subscriber) {
                try {
                    if (!subscriber.isUnsubscribed()) {
                        for (int i = 1; i < 5; i++) {
                            subscriber.onNext(i);
                        }
                        subscriber.onCompleted();
                    }
                } catch (Exception e) {
                    subscriber.onError(e);
                }
            }
        }).subscribe(new Subscriber() {
            @Override
            public void onCompleted() {
                Log.e(TAG,"onCompleted");
            }

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

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

from操作符是把其他类型的对象和数据类型转化成Observable

 String[] strs={"aa","bb","cc","dd"};
        Observable.from(strs).subscribe(new Subscriber() {
            @Override
            public void onCompleted() {
                Log.e(TAG,"onCompleted");
            }

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

            @Override
            public void onNext(String str) {
                Log.e(TAG,"onNext : "+str);
            }
        });
  1. just

just操作符也是把其他类型的对象和数据类型转化成Observable,它和from操作符很像,只是方法的参数有所差别

 Observable.just(1,"a",'b',"%").subscribe(new Subscriber() {
            @Override
            public void onCompleted() {
                Log.e(TAG,"onCompleted");
            }

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

            @Override
            public void onNext(Serializable serializable) {
                Log.e(TAG,"onNext : "+serializable);
            }
        });
  1. defer

defer操作符是直到有订阅者订阅时,才通过Observable的工厂方法创建Observable并执行,defer操作符能够保证Observable的状态是最新的.

    i=10;
    Observable justObservable = Observable.just(i);
    i=12;
    Observable deferObservable = Observable.defer(new Func0>() {
        @Override
        public Observable call() {
            return Observable.just(i);
        }
    });
    i=15;

    justObservable.subscribe(new Action1() {
        @Override
        public void call(Integer o) {
            Log.e(TAG,"just i="+o);
        }
    });

    deferObservable.subscribe(new Action1() {
        @Override
        public void call(Integer o) {
            Log.e(TAG,"defer i="+o);
        }
    });
    
    
=====>: ----------defer-----------
=====>: just i=10
=====>: defer i=15
  1. timer

timer操作符是隔一段时间产生一个数字,然后就结束,可以理解为延迟产生数字,也可以用来延迟执行动作

timer操作符默认情况下是运行在一个新线程上的,当然你可以通过传入参数来修改其运行的线程.

 Observable.timer(2,TimeUnit.SECONDS).subscribe(new Action1() {
        @Override
        public void call(Long aLong) {
            Log.e(TAG,"timer : "+aLong);
        }
    });
  1. interval

interval操作符是每隔一段时间就产生一个数字,这些数字从0开始,一次递增1直至无穷大,也可以通过改变参数使其在一段时间内递增。默认情况下是运行在一个新线程上的,当然你可以通过传入参数来修改其运行的线程.

Observable.interval(2,TimeUnit.SECONDS).subscribe(new Action1() {
            @Override
            public void call(Long aLong) {
                Log.e(TAG,"interval : "+aLong);
            }
        });
  1. range

range操作符是创建一组在从n开始,个数为m的连续数字,比如range(3,10),就是创建3、4、5…12的一组数字

Observable.range(4,5).subscribe(new Subscriber() {
            @Override
            public void onCompleted() {
                Log.e(TAG,"onCompleted");
            }

            @Override
            public void onError(Throwable e) {

            }

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

repeat操作符是对某一个Observable,重复产生多次结果

和其他操作符一起使用的

//连续产生两组(3,4,5)的数字
        Observable.range(3,3).repeat(2).subscribe(new Subscriber() {
            @Override
            public void onCompleted() {
                Log.e(TAG,"onCompleted");
            }

            @Override
            public void onError(Throwable e) {
                System.out.println("error:" + e.getMessage());
            }

            @Override
            public void onNext(Integer i) {
                Log.e(TAG,"repeat : "+i );
            }
        });

变换

  1. buffer

buffer操作符周期性地收集源Observable产生的结果到列表中,并把这个列表提交给订阅者,订阅者处理后,清空buffer列表,同时接收下一次收集的结果并提交给订阅者,周而复始。

一旦源Observable在产生结果的过程中出现异常,即使buffer已经存在收集到的结果,订阅者也会马上收到这个异常,并结束整个过程。

 final String[] mails = new String[]{"Here is an email!", "Another email!", "Yet another email!"};
    //每隔1秒就随机发布一封邮件
    Observable endlessMail = Observable.create(new Observable.OnSubscribe() {
        @Override
        public void call(Subscriber subscriber) {
            try {
                if (subscriber.isUnsubscribed()) return;
                Random random = new Random();
                while (true) {
                    String mail = mails[random.nextInt(mails.length)];
                    subscriber.onNext(mail);
                    Thread.sleep(1000);
                }
            } catch (Exception ex) {
                subscriber.onError(ex);
            }
        }
    }).subscribeOn(Schedulers.io());
    //把上面产生的邮件内容缓存到列表中,并每隔3秒通知订阅者
    endlessMail.buffer(3, TimeUnit.SECONDS).subscribe(new Action1>() {
        @Override
        public void call(List list) {
            Log.e(TAG,String.format("You've got %d new messages!  Here they are!", list.size()));
            for (int i = 0; i < list.size(); i++)
                Log.e(TAG,"**" + list.get(i).toString());
        }
    });
  1. map

map操作符是把源Observable产生的结果,通过映射规则转换成另一个结果集,并提交给订阅者进行处理。

 Observable.just(1,2,3,4,5,6).map(new Func1() {
        @Override
        public Integer call(Integer integer) {
            //对源Observable产生的结果,都统一乘以3处理
            return integer*3;
        }
    }).subscribe(new Action1() {
        @Override
        public void call(Integer integer) {
            Log.e(TAG,"next:" + integer);
        }
    });
  1. faltMap

flatMap操作符是把Observable产生的结果转换成多个Observable,然后把这多个Observable“扁平化”成一个Observable,并依次提交产生的结果给订阅者。

flatMap操作符通过传入一个函数作为参数转换源Observable,在这个函数中,你可以自定义转换规则,最后在这个函数中返回一个新的Observable,然后flatMap操作符通过合并这些Observable结果成一个Observable,并依次提交结果给订阅者。

flatMap操作符在合并Observable结果时,有可能存在交叉的情况

  1. contactMap

cancatMap操作符与flatMap操作符类似,都是把Observable产生的结果转换成多个Observable,然后把这多个Observable“扁平化”成一个Observable,并依次提交产生的结果给订阅者。

与flatMap操作符不同的是,concatMap操作符在处理产生的Observable时,采用的是“连接(concat)”的方式,而不是“合并(merge)”的方式,这就能保证产生结果的顺序性,也就是说提交给订阅者的结果是按照顺序提交的,不会存在交叉的情况。

  1. switchMap

switchMap操作符与flatMap操作符类似,都是把Observable产生的结果转换成多个Observable,然后把这多个Observable“扁平化”成一个Observable,并依次提交产生的结果给订阅者。

与flatMap操作符不同的是,switchMap操作符会保存最新的Observable产生的结果而舍弃旧的结果,举个例子来说,比如源Observable产生A、B、C三个结果,通过switchMap的自定义映射规则,映射后应该会产生A1、A2、B1、B2、C1、C2,但是在产生B2的同时,C1已经产生了,这样最后的结果就变成A1、A2、B1、C1、C2,B2被舍弃掉了!

//flatMap操作符的运行结果
    Observable.just(10, 20, 30).flatMap(new Func1>() {
        @Override
        public Observable call(Integer integer) {
            //10的延迟执行时间为200毫秒、20和30的延迟执行时间为180毫秒
            int delay = 200;
            if (integer > 10)
                delay = 180;
            return Observable.from(new Integer[]{integer, integer / 2}).delay(delay, TimeUnit.MILLISECONDS);
        }
    }).observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1() {
        @Override
        public void call(Integer integer) {
            Log.e(TAG,"flatMap Next:" + integer);
        }
    });

    //concatMap操作符的运行结果
    Observable.just(10, 20, 30).concatMap(new Func1>() {
        @Override
        public Observable call(Integer integer) {
            //10的延迟执行时间为200毫秒、20和30的延迟执行时间为180毫秒
            int delay = 200;
            if (integer > 10)
                delay = 180;

            return Observable.from(new Integer[]{integer, integer / 2}).delay(delay, TimeUnit.MILLISECONDS);
        }
    }).observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1() {
        @Override
        public void call(Integer integer) {
            Log.e(TAG,"concatMap Next:" + integer);
        }
    });

    //switchMap操作符的运行结果
    Observable.just(10, 20, 30).switchMap(new Func1>() {
        @Override
        public Observable call(Integer integer) {
            //10的延迟执行时间为200毫秒、20和30的延迟执行时间为180毫秒
            int delay = 200;
            if (integer > 10)
                delay = 180;

            return Observable.from(new Integer[]{integer, integer / 2}).delay(delay, TimeUnit.MILLISECONDS);
        }
    }).observeOn(AndroidSchedulers.mainThread()).subscribe(new Action1() {
        @Override
        public void call(Integer integer) {
            Log.e(TAG,"switchMap Next:" + integer);
        }
    });
    
    

结果

=====>: ------flatMap、concatMap、switchMap-----
=====>: flatMap Next:30
=====>: flatMap Next:20
=====>: flatMap Next:10
=====>: flatMap Next:15
=====>: flatMap Next:10
=====>: flatMap Next:5

=====>: switchMap Next:30
=====>: switchMap Next:15

=====>: concatMap Next:10
=====>: concatMap Next:5
=====>: concatMap Next:20
=====>: concatMap Next:10
=====>: concatMap Next:30
=====>: concatMap Next:15
  1. GroupBy

groupBy操作符是对源Observable产生的结果进行分组,形成一个类型为GroupedObservable的结果集,GroupedObservable中存在一个方法为getKey(),可以通过该方法获取结果集的Key值(类似于HashMap的key)。

值得注意的是,由于结果集中的GroupedObservable是把分组结果缓存起来,如果对每一个GroupedObservable不进行处理(既不订阅执行也不对其进行别的操作符运算),就有可能出现内存泄露。因此,如果你对某个GroupedObservable不进行处理,最好是对其使用操作符take(0)处理。

  1. cast

cast操作符类似于map操作符,不同的地方在于map操作符可以通过自定义规则,把一个值A1变成另一个值A2,A1和A2的类型可以一样也可以不一样;而cast操作符主要是做类型转换的,传入参数为类型class,如果源Observable产生的结果不能转成指定的class,则会抛出ClassCastException运行时异常。

  1. scan

scan操作符通过遍历源Observable产生的结果,依次对每一个结果项按照指定规则进行运算,计算后的结果作为下一个迭代项参数,每一次迭代项都会把计算结果输出给订阅者。

  1. window

window操作符非常类似于buffer操作符,区别在于buffer操作符产生的结果是一个List缓存,而window操作符产生的结果是一个Observable,订阅者可以对这个结果Observable重新进行订阅处理。

过滤

  1. debounce
  1. distinct
  2. elementAt
  3. filter
  4. ofType
  5. first
  6. single
  7. last
  8. ignoreElements
  9. sample
  10. skip
  11. skipLast
  12. take
  13. takeFirst
  14. takeLast

组合操作符

  1. merge
  2. zip
  3. join
  4. combineLatest
  5. and/when/then
  6. switch
  7. startSwitch

本文为作者学习用,内容抄自RxJava操作符
更多操作符看RxJava docs

你可能感兴趣的:(Rxjava操作符)