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