RxJava操作符

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);
     }
});

这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值