RxJava操作符

xiaoxiao2021-02-28  105

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

转载请注明原文地址: https://www.6miu.com/read-55398.html

最新回复(0)