之前没有了解过Rxjava的童鞋,建议先阅读《Rxjava 从入门到开发》这篇文章,对入门比较有帮助。
Debounce操作符
作用:仅在过了一段指定的时间还没发射数据时才发射一个数据

Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
try {
for(int i=1;i<5;i++){
subscriber.onNext(i);
//时间延迟为0、100、200...900毫秒
Thread.sleep(i*100);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).debounce(300,TimeUnit.MILLISECONDS).subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
Logger.i(String.valueOf(integer));
}
});
输出结果:

例子说明:输出结果1,2时间在300ms内,一次被过滤掉了,3,4输出时间间隔为300ms和400ms所以被保留。
Distinct操作符
作用:抑制(过滤掉)重复的数据项

Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
for(int i=0;i<10;i++){
subscriber.onNext(random.nextInt(3));
}
}
}).distinct().observeOn(Schedulers.io()).subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
Logger.i(String.valueOf(integer));
}
});
输出结果:

例子说明:例子原来应该输出10个结果,但是在操作符distinct过滤重复结果的作用下,实际输出3个结果。
Filter操作符
作用:输出过滤条件后的结果项

Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
for(int i=0;i<10;i++){
subscriber.onNext(random.nextInt(20));
}
}
}).filter(new Func1<Integer, Boolean>() {
@Override
public Boolean call(Integer integer) {
return 10<integer&&integer<15;
}
}).observeOn(Schedulers.io()).subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
Logger.i(String.valueOf(integer));
}
});
输出结果:

例子说明:例子随机输出10项数据,在filter的条件作用下,最终实际输出符合条件的两项数据结果。
Sample操作符
作用:定期发射Observable最近发射的数据项

Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
try {
for(int i=1;i<5;i++){
subscriber.onNext(i);
Thread.sleep(100);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).sample(300,TimeUnit.MILLISECONDS).observeOn(Schedulers.io()).subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
Logger.i(String.valueOf(integer));
}
});
输出结果:

例子说明:demo连续输出5项数据,间隔为100毫秒,通过Sample操作符作用,每300毫秒输出最后一项数据,故最后输出结果为3,4。
在此需要再解析下Sample和Debounce操作符的区别,其实两者功能很相似,感觉都是在过一段时间后输出最后一项数据,但不同的是Sample是周期输出,而Debounce是针对指定时间段,以Sample的demo说明,demo的结果输出是3,4。但是如果操作符改成debounce,那么输出结果仅有4,为什么呢?因为sample是周期性输出,就无论如何每隔300ms就要输出一次结果,但是debounce不同,它在300ms的时候要输出3了,还得判断3后的300ms是否有数据输出,如果有那么就通过最新的数据再按照类似的规则继续判断是否输出新数据,如果没有,那么就输出,所以最终输出的结果是4。
Skip操作符
作用:跳过开始的N项数据

Observable.interval(1, TimeUnit.SECONDS).skip(2).observeOn(Schedulers.io()).subscribe(new Action1<Long>() {
@Override
public void call(Long aLong) {
Logger.i(String.valueOf(aLong));
}
});
输出结果:

例子说明:本来正常输出结果为0,1,2,3... 现在输出结果为2,3,4...跳过了前面两项。
Take操作符
作用:只发射开始的N项数据

Observable.interval(1, TimeUnit.SECONDS).take(2).subscribe(new Action1<Long>() {
@Override
public void call(Long aLong) {
Logger.i(String.valueOf(aLong));
}
});
输出结果:

例子说明:本来正常输出结果为0,1,2,3... 现在输出结果为0,1只保留前面两项。
以上便是过滤操作符的主要内容了。有啥问题欢迎大家留言交流下😊,下篇文章再说说结合操作符欢迎关注。
附录:
文章demo
网友评论