(点击上方公众号,可快速关注)
来源:伯乐在线专栏作者 - Code4Android
链接:http://android.jobbole.com/85254/
如有好文章投稿,请点击 → 这里了解详情
接上文
Take
Take操作符可以修改Observable的行为,只返回前面的N项数据,然后发射完成通知,忽略剩余的数据。
Observable.range(1,8)
.take(4)
.subscribe(new Subscriber() {
@Override
public void onNext(Integer item) {
Log.e(TAG, "Next: " + item);
}
@Override
public void onError(Throwable error) {
Log.e(TAG, "Error: " + error.getMessage());
}
@Override
public void onCompleted() {
Log.e(TAG, "complete.");
}
});
输出日志信息
Next: 1
Next: 2
Next: 3
Next: 4
complete
take和skip一样也有其它两个重载方法take(long time, TimeUnit unit),take(long time, TimeUnit unit, Scheduler scheduler),默认在computation调度器上执行。
take还有变体操作符TakeLast,takeLastBuffer具体执行效果可自行代码。
Debounce
该操作符指的是过了一段指定的时间还没发射数据时才发射一个数据,听着可能有点绕。你可以理解对源Observable间隔期产生的结果进行过滤,如果在这个规定的间隔期内没有别的结果产生,则将这个结果提交给订阅者,否则忽略该结果,原理有点像光学防抖
上代码
Observable.range(1,8)
.take(4)
.subscribe(new Subscriber() {
@Override
public void onNext(Integer item) {
Log.e(TAG, "Next: " + item);
}
@Override
public void onError(Throwable error) {
Log.e(TAG, "Error: " + error.getMessage());
}
@Override
public void onCompleted() {
Log.e(TAG, "complete.");
}
});
输出信息
onNext: 4
onNext: 5
onNext: 6
onNext: 7
onNext: 8
onNext: 9
onCompleted:
这个输出数据不一定一样,有可能从5开始。
Distinct
这个比较好理解,它就是过滤掉重复的数据,只允许还没有发射过的数据项通过。
示例代码
Observable.just(0, 0, 6, 4, 2, 8, 2, 1, 9, 0)
.distinct()
.subscribe(new Subscriber() {
@Override
public void onCompleted() {
Log.e(TAG, "onCompleted:Distinct ");
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "onError:Distinct ");
}
@Override
public void onNext(Integer integer) {
Log.e(TAG, "onNext:Distinct " + integer);
}
});
输出日志信息
onNext:Distinct 0
onNext:Distinct 6
onNext:Distinct 4
onNext:Distinct 2
onNext:Distinct 8
onNext:Distinct 1
onNext:Distinct 9
onCompleted:Distinct
ElementAt
该操作符获取原始Observable发射的数据序列指定索引位置的数据项,然后当做自己的唯一数据发射。给它传递一个基于0的索引值,它会发射原始Observable数据序列对应索引位置的值,如果你传递给elementAt的值为4,那么它会发射第5项的数据。如下示例代码
Observable.just(0, 0, 6, 4, 2, 8, 2, 1, 9, 0)
.elementAt(4)
.subscribe(new Subscriber() {
@Override
public void onCompleted() {
Log.e(TAG, "onCompleted:ElementAt ");
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "onError:ElementAt ");
}
@Override
public void onNext(Integer integer) {
Log.e(TAG, "onNext:ElementAt " + integer);
}
});
输出日志信息
onNext:ElementAt 2
onCompleted:ElementAt
IgnoreElements
操作符抑制原始Observable发射的所有数据,只允许它的终止通知(onError或onCompleted)通过,使用该操作符onNext()方法不会执行。
Observable.just(1, 2, 3).ignoreElements().subscribe(new Subscriber() {
@Override
public void onCompleted() {
Log.e(TAG, "onCompleted");
}
@Override
public void onError(Throwable e) {
Log.e(TAG, "onError");
}
@Override
public void onNext(Integer integer) {
Log.e(TAG, "onNext");
}
});
执行后只会输出onCompleted。这个操作符效果就如同empty()方法创建一个空的Observable,只会执行onCompleted()方法,不同的是ignoreElements是对数据源的处理,而empty()是创建Observable。
今天的这篇文章就到此结束,欢迎大家阅读,若发现文中有错误的地方欢迎留言提出,感谢。
看完本文有收获?请分享给更多人
关注「安卓开发精选」,看技术干货