系列文章
RxJava系列之簡介和觀察者設計模式
RxJava系列之上游與下游
RxJava系列之常用創建型操作符
RxJava系列之常用變換操作符
RxJava系列之常用過濾操作符
RxJava系列之常用條件操作符
RxJava系列之常用合併操作符
RxJava系列之常用異常操作符
RxJava系列之線程切換實戰
RxJava系列之背壓模式
RxJava系列之配合Retrofit
RxJava系列之泛型高級
RxJava系列之手寫create操作符
RxJava系列之手寫create操作符增加泛型限定
RxJava系列之手寫just操作符
RxJava系列之手寫map操作符
RxJava系列之手寫切換線程
過濾操作符
上篇文章中,我們學習了變換操作符。 過濾操作符顧名思義就是對數據的篩選與過濾,與變換操作符的位置相同,作用不同。
filter
如果過濾操作符的方法返回false,則過濾掉該條數據,返回true則不過濾該條數據。
/**
* filter 過濾
* 需求:過濾掉 哪些不合格的奶粉,輸出哪些合格的奶粉
* @param view
*/
public void r01(View view) {
// 上游
Observable.just("三鹿", "合生元", "飛鶴")
.filter(new Predicate<String>() {
@Override
public boolean test(String s) throws Exception {
// return true; // 不去過濾,默認全部都會打印
// return false; // 如果是false 就全部都不會打印
if ("三鹿".equals(s)) {
return false; // 不合格
}
return true;
}
})
// 訂閱
.subscribe(new Consumer<String>() { // 下游
@Override
public void accept(String s) throws Exception {
Log.d(TAG, "accept: " + s);
}
});
}
take
take過濾操作符需要跟定時器配合使用,是定時器的停止條件。
/**
* take過濾操作符
* @param view
*/
public void r02(View view) {
// 定時器 運行 只有再定時器運行基礎上 加入take過濾操作符,纔有take過濾操作符的價值
// 上游
Observable.interval(2, TimeUnit.SECONDS)
// 增加過濾操作符,停止定時器
.take(8) // 執行次數達到8 停止下來
.subscribe(new Consumer<Long>() { // 下游
@Override
public void accept(Long aLong) throws Exception {
Log.d(TAG, "accept: " + aLong);
}
});
}
distinct
distinct過濾操作符可以過濾掉相同數據的,底層應該調用了equals方法判斷兩個對象是否相同。
/**
* distinct過濾重複事件
* @param view
*/
public void r03(View view) {
// 上游
Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> e) throws Exception {
e.onNext(1);
e.onNext(1);
e.onNext(2);
e.onNext(3);
e.onNext(4);
e.onNext(4);
e.onComplete();
}
})
.distinct() // 過濾重複 發射的事件
.subscribe(new Consumer<Integer>() { // 下游 觀察者
@Override
public void accept(Integer integer) throws Exception {
Log.d(TAG, "accept: " + integer); // 事件不重複
}
});
}
elementAt
elementAt過濾操作符只要指定索引置爲的數據,其它數據都不要了
/**
* elementAt 指定過濾的內容
* @param view
*/
public void r04(View view) {
// 上游
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> e) throws Exception {
e.onNext("九陰真經");
e.onNext("九陽真經");
e.onNext("易筋經");
e.onNext("神照經");
e.onComplete();
}
})
// 過濾操作符
.elementAt(100, "默認經") // 指定下標輸出 事件
// 訂閱
.subscribe(new Consumer<String>() { // 下游
@Override
public void accept(String s) throws Exception {
Log.d(TAG, "accept: " + s);
}
});
}
總結
上游 -------> 過濾操作(往右邊流向的時候,進行過濾) ----------> 下游
1.filter 如果是false全部都發射給下游,如果是true,全部都不發射給下游。
2.take :只有再定時器運行基礎上 加入take過濾操作符,纔有take過濾操作符的價值。
3.distinct過濾重複事件。
4.elementAt 指定保留索引位置發射事件的內容,如果無法指定,有默認的事件。