创建型
- create
create操作符是所有创建型操作符的“根”,也就是说其他创建型操作符最后都是通过create操作符来创建Observable的.
Observable.create(new Observable.OnSubscribe() {
@Override
public void call(Subscriber super Integer> 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);
}
});
}
- 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);
}
});
- 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);
}
});
- 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
- timer
timer操作符是隔一段时间产生一个数字,然后就结束,可以理解为延迟产生数字,也可以用来延迟执行动作
timer操作符默认情况下是运行在一个新线程上的,当然你可以通过传入参数来修改其运行的线程.
Observable.timer(2,TimeUnit.SECONDS).subscribe(new Action1() {
@Override
public void call(Long aLong) {
Log.e(TAG,"timer : "+aLong);
}
});
- interval
interval操作符是每隔一段时间就产生一个数字,这些数字从0开始,一次递增1直至无穷大,也可以通过改变参数使其在一段时间内递增。默认情况下是运行在一个新线程上的,当然你可以通过传入参数来修改其运行的线程.
Observable.interval(2,TimeUnit.SECONDS).subscribe(new Action1() {
@Override
public void call(Long aLong) {
Log.e(TAG,"interval : "+aLong);
}
});
- 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 );
}
});
- 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 );
}
});
变换
- 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 super String> 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());
}
});
- 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);
}
});
- faltMap
flatMap操作符是把Observable产生的结果转换成多个Observable,然后把这多个Observable“扁平化”成一个Observable,并依次提交产生的结果给订阅者。
flatMap操作符通过传入一个函数作为参数转换源Observable,在这个函数中,你可以自定义转换规则,最后在这个函数中返回一个新的Observable,然后flatMap操作符通过合并这些Observable结果成一个Observable,并依次提交结果给订阅者。
flatMap操作符在合并Observable结果时,有可能存在交叉的情况
- contactMap
cancatMap操作符与flatMap操作符类似,都是把Observable产生的结果转换成多个Observable,然后把这多个Observable“扁平化”成一个Observable,并依次提交产生的结果给订阅者。
与flatMap操作符不同的是,concatMap操作符在处理产生的Observable时,采用的是“连接(concat)”的方式,而不是“合并(merge)”的方式,这就能保证产生结果的顺序性,也就是说提交给订阅者的结果是按照顺序提交的,不会存在交叉的情况。
- 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
- GroupBy
groupBy操作符是对源Observable产生的结果进行分组,形成一个类型为GroupedObservable的结果集,GroupedObservable中存在一个方法为getKey(),可以通过该方法获取结果集的Key值(类似于HashMap的key)。
值得注意的是,由于结果集中的GroupedObservable是把分组结果缓存起来,如果对每一个GroupedObservable不进行处理(既不订阅执行也不对其进行别的操作符运算),就有可能出现内存泄露。因此,如果你对某个GroupedObservable不进行处理,最好是对其使用操作符take(0)处理。
- cast
cast操作符类似于map操作符,不同的地方在于map操作符可以通过自定义规则,把一个值A1变成另一个值A2,A1和A2的类型可以一样也可以不一样;而cast操作符主要是做类型转换的,传入参数为类型class,如果源Observable产生的结果不能转成指定的class,则会抛出ClassCastException运行时异常。
- scan
scan操作符通过遍历源Observable产生的结果,依次对每一个结果项按照指定规则进行运算,计算后的结果作为下一个迭代项参数,每一次迭代项都会把计算结果输出给订阅者。
- window
window操作符非常类似于buffer操作符,区别在于buffer操作符产生的结果是一个List缓存,而window操作符产生的结果是一个Observable,订阅者可以对这个结果Observable重新进行订阅处理。
过滤
- debounce
- distinct
- elementAt
- filter
- ofType
- first
- single
- last
- ignoreElements
- sample
- skip
- skipLast
- take
- takeFirst
- takeLast
组合操作符
- merge
- zip
- join
- combineLatest
- and/when/then
- switch
- startSwitch
本文为作者学习用,内容抄自RxJava操作符
更多操作符看RxJava docs