RxJava操作符

来源:互联网 发布:淘宝托管公司被骗18万 编辑:程序博客网 时间:2024/04/30 02:29

RxJava操作符类型分为:创建操作符、变换操作符、过滤操作符、组合操作符、错误处理操作符、条件和布尔操作符、算术和聚合操作符及连接操作符等,官方文档:http://reactivex.io/RxJava/javadoc/

1.创建操作符:create、just、from、defer、range、interval、start、repeat、timer等

    Interval操作符返回一个Observable,它按固定的时间间隔发射一个无限递增的整数序列    Observable.interval(3,TimeUnit.SECONDS)       //每隔3秒调用onNext方法,并让onNext方法在主线程中运行       .observeOn(AndroidSchedulers.mainThread())       .subscribe(subscriber);    Subscriber subscriber = new Subscriber<Long>() {        @Override        public void onCompleted() {        }        @Override        public void onError(Throwable e) {        }        @Override        public void onNext(Long aLong) {            Log.d("TAG",Thread.currentThread().getName());            Log.d("TAG","onNext:  "+aLong.intValue());            textView.setText(""+aLong.intValue());        }    };   //取消订阅   subscriber.unsubscribe();

这里写图片描述

2、变换操作符:对Observable发射的数据按照一定规则做一些变换操作,然后将变换后的数据发射出去,有map、flatMap、concatMap、switchMap、flatMapIterable、buffer、groupby、cast、window、scan等。

map:通过指定一个Func对象,将传入的对象转换为一个新的对象并发射,观察者将收到新的对象处理。

 Observable.just(R.drawable.aries)     .map(new Func1<Integer,Bitmap>() {     @Override          public Bitmap call(Integer integer) {               return getBitmapFromPath(integer);          }      })      .subscribe(new Action1<Bitmap>() {            @Override          public void call(Bitmap bitmap) {               image.setImageBitmap(bitmap);          }      });private Bitmap getBitmapFromPath(int s) {   return BitmapFactory.decodeResource(getResources(),s);}

可以看到在just方法中传入的是int类型的对象,在经过map方法转换后将原本应该发射的int类型的对象转化为Bitmap类型的对象发射给subscriber(观察者)。

flatMap:将Observable发射的数据集合转换为新的Observable数据集合,然后将这些发射的数据平坦化的放进一个单独的Observable

List<String> list = new ArrayList<>();    list.add("1");    list.add("2");    list.add("3");    list.add("4");    list.add("5");final String host = "数字的值是:";Action1 action = new Action1<String>() {    @Override    public void call(String s) {        Log.d("TAG",s);    }};Observable.from(list)   .flatMap(new Func1<String, Observable<?>>() {        @Override        public Observable<?> call(String s) {           return Observable.just(host+s);        }    })   .subscribe(action);

这里写图片描述

3.过滤操作符:主要用于过滤和选择Observable发射的数据序列,让Observable只返回满足我们条件的数据,包含:filter、elementAt、distinct、skip、throttleFirst等。

filter:对源Observable产生的结果根据自定义规则进行过滤,只有满足调条件的结果才会提交给订阅者

List<String> list = new ArrayList<>();   list.add("1");   list.add("2");   list.add("3");   list.add("4");   list.add("5");Observable.from(list).filter(new Func1<String, Boolean>() {    @Override    public Boolean call(String s) {        return s.equals("2");    }}).subscribe(new Action1<String>() {    @Override    public void call(String s) {        Log.d("TAG","filter:"+s);    }});

这里写图片描述

throttleFirst:定期发射这个时间段里源Observable发射的第一个数据

Observable.create(new Observable.OnSubscribe<Integer>() {    @Override    public void call(Subscriber<? super Integer> subscriber) {       for(int i = 0;i<10;i++){          subscriber.onNext(i);          try {             Thread.sleep(100);          }catch (InterruptedException e) {             e.printStackTrace();          }       }       subscriber.onCompleted();    }}).throttleFirst(200,TimeUnit.MILLISECONDS).subscribe(new Action1<Integer>() {     @Override     public void call(Integer integer) {         Log.d("TAG","throttleFirst:"+integer);     }});

每隔100ms发射一个数据,throttleFirst操作符设定的时间是200ms,因此它会发射每个200ms内的第一个数据
这里写图片描述

4.条件操作符:amb、defaultIfEmpty、skipUntil、skipWhile、takeUntil和takeWhile等
amb:对于给定两个或多个Observable,它只发射首先发射数据或通知的那个Observabe的所有数据

Observable.amb(Observable.just(1,2,3).delay(2,TimeUnit.MILLISECONDS),Observable.just(4,5,6)).subscribe(new Action1<Integer>() {     @Override     public void call(Integer integer) {         Log.d("TAG","amb:"+integer);     }});

这里写图片描述

原创粉丝点击