RxJava操作符之过滤操作
2017-01-22 本文已影响39人
莫比乌丝环丶
Debounce
仅在过了一段指定的时间还没发射数据时才发射一个数据
![](https://img.haomeiwen.com/i2062578/212fb13a4dea1fe1.png)
Debounce操作符会过滤掉发射速率过快的数据项。
debounce
操作符的一个变体通过对原始Observable的每一项应用一个函数进行限流,这个函数返回一个Observable。如果原始Observable在这个新生成的Observable终止之前发射了另一个数据,debounce
会抑制(suppress)这个数据项。
debounce
的这个变体默认不在任何特定的调度器上执行。
RxJava将这个操作符实现为throttleWithTimeout
和debounce
。
注意:这个操作符会会接着最后一项数据发射原始Observable的onCompleted
通知,即使这个通知发生在你指定的时间窗口内(从最后一项数据的发射算起)。也就是说,onCompleted
通知不会触发限流。
throttleWithTimeout
![](https://img.haomeiwen.com/i2062578/def5654c1f13069d.png)
throtleWithTimeout/debounce
的一个变体根据你指定的时间间隔进行限流,时间单位通过TimeUnit
参数指定。
这种操作符默认在computation
调度器上执行,但是你可以通过第三个参数指定。
Javadoc:
throttleWithTimeout(long,TimeUnit)
) and
)
Javadoc:
throttleWithTimeout(long,TimeUnit,Scheduler)
) and
debounce(long,TimeUnit,Scheduler)
)
Distinct
抑制(过滤掉)重复的数据项
![](https://img.haomeiwen.com/i2062578/2cc0126b81fa612b.png)
Distinct
的过滤规则是:只允许还没有发射过的数据项通过。
在某些实现中,有一些变体允许你调整判定两个数据不同(distinct
)的标准。还有一些实现只比较一项数据和它的直接前驱,因此只会从序列中过滤掉连续重复的数据。
示例代码
Observable.just(1, 2, 1, 1, 2, 3)
.distinct()
.subscribe(new Subscriber<Integer>() {
@Override
public void onNext(Integer item) {
System.out.println("Next: " + item);
}
@Override
public void onError(Throwable error) {
System.err.println("Error: " + error.getMessage());
}
@Override
public void onCompleted() {
System.out.println("Sequence complete.");
}
});
输出
Next: 1
Next: 2
Next: 3
Sequence complete.