初識RxJava(五)過濾類 操作符
阿新 • • 發佈:2018-11-10
前言:
前面已經記錄了四種操作符,分別是 建立、延時、轉換、組合 操作符,每天閒來無事看一篇。找個時間 寫個demo 敲一下,然後就大體記住了,會用的第一步是記住 ,記住的第一步 是認識。下面開始 過濾 操作符的 筆記記錄;
正文:
1、filter 操作符
1)、作用
從被觀察者內過濾掉不符合需求條件的 內容,將符合條件的內容 發射給 觀察者;
2)、程式碼
/** * filter 操作符 */ private void filterMethod() { Observable.just(1, 2, 3, 4, 5, 6, 7).filter(new Predicate<Integer>() { @Override public boolean test(Integer integer) throws Exception { return integer > 4; } }).subscribe(new Observer<Integer>() { @Override public void onSubscribe(Disposable d) { logDUtils("onSubscribe"); } @Override public void onNext(Integer integer) { logDUtils("onNext:" + integer); } @Override public void onError(Throwable e) { logDUtils("onError:" + e.getMessage()); } @Override public void onComplete() { logDUtils("onComplete"); } }); }
3)、效果
2、ofType 操作符
1)、作用
用於過濾被觀察者 傳送的資料 得到指定型別資料,將篩選後的資料 在 觀察者那裡進行接收;
2)、程式碼
/** * ofType 操作符 */ private void ofTypeMethod() { Observable.just(1, "Android", "Java", 4, "航展") .ofType(String.class).subscribe(new Observer<String>() { @Override public void onSubscribe(Disposable d) { logDUtils("onSubscribe"); } @Override public void onNext(String s) { logDUtils("onNext:" + s); } @Override public void onError(Throwable e) { logDUtils("onError:" + e.getMessage()); } @Override public void onComplete() { logDUtils("onComplete"); } }); }
3)、效果
3、skip 操作符 和 skipLast 操作符
1)、作用
skip: 跳過發射事件 的前 n 個 資料;
skipLast :跳過發射事件 的後 n 個 資料。
2)、程式碼
/** * skip 操作符 和 skipLast 操作符 */ @SuppressLint("CheckResult") private void skipMethod() { Observable.just(1, 2, 3, 4, 5, 6, 7, 8).skip(2).skipLast(3) .subscribe(new Consumer<Integer>() { @Override public void accept(Integer integer) throws Exception { logDUtils("accept:" +integer); } }); }
3)、效果
4、distinct 操作符 和 distinctUntilChanged 操作符
1)、作用
distinct : 過濾重複的事件
distinctUntilChanged : 過濾連續重複事件
2)、程式碼
/**
* distinct 操作符 和 distinctUntilChanged 操作符
*/
@SuppressLint("CheckResult")
private void distinctMethod() {
Observable.just(1, 22, 33, 44, 55, 33, 1, 22).distinct().subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
logDUtils("distinct--->accept:" + integer);
}
});
Observable.just(1, 1, 2, 3, 4, 4, 5, 6, 6,5).distinctUntilChanged().subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
logDUtils("distinctUntilChanged--->accept:" + integer);
}
});
}
3)、效果
5、take 操作符 和 takeLast 操作符
1)、作用
take :只獲取 被觀察者 傳送的資料的 前幾位數據
takeLast :只獲取 被觀察 傳送的資料 的後幾位數據
2)、程式碼
/**
* take 操作符 和 takeLast 操作符
*/
@SuppressLint("CheckResult")
private void takeMethod() {
Observable.just(1, 2, 3, 4, 5, 6, 7).take(3).subscribe(new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
logDUtils("take--->onSubscribe");
}
@Override
public void onNext(Integer integer) {
logDUtils("take--->onNext:" + integer);
}
@Override
public void onError(Throwable e) {
logDUtils("take--->onError:" + e.getMessage());
}
@Override
public void onComplete() {
logDUtils("take--->onComplete");
}
});
Observable.just(1, 2, 3, 4, 5, 6, 78, 9).takeLast(4).subscribe(new Observer<Integer>() {
@Override
public void onSubscribe(Disposable d) {
logDUtils("takeLast--->onSubscribe");
}
@Override
public void onNext(Integer integer) {
logDUtils("takeLast--->onNext:" + integer);
}
@Override
public void onError(Throwable e) {
logDUtils("takeLast--->onError:" + e.getMessage());
}
@Override
public void onComplete() {
logDUtils("takeLast--->onComplete");
}
});
}
3)、效果
6、throttleFirst 操作符 和 throttleLast 操作符
1)、作用
throttleFirst :規定事件內 只發送 這段時間內的 第 1 次資料
throttleLast :規定事件內 只發送 這段時間內的 最後 1 次資料
2)、程式碼
/**
* throttleFirst 操作符 和 throttleLast 操作符
*/
@SuppressLint("CheckResult")
private void throttleFirstAndThrottleLastMethod() {
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> emitter) throws Exception {
emitter.onNext("a");
Thread.sleep(400);
emitter.onNext("b");
Thread.sleep(400);
emitter.onNext("c");
Thread.sleep(400);
emitter.onNext("d");
Thread.sleep(400);
emitter.onNext("e");
Thread.sleep(400);
emitter.onNext("f");
}
}).throttleFirst(2, TimeUnit.SECONDS).subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
logDUtils("throttleFirst--->accept:" + s);
}
});
// interval 操作符: 從 0 開始 每隔 100 毫秒 產生一個遞增的 long 型別資料
Observable.interval(100, TimeUnit.MILLISECONDS)
.throttleLast(1, TimeUnit.SECONDS)
.subscribe(new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Exception {
logDUtils("throttleLast---->accept:" + aLong);
}
});
}
3)、效果
7、Sample 操作符
作用
在某段時間內,只發送該段時間內最新即最後一次 1次事件 類似於 throttleLast 操作符
8、throttleWithTimeout 操作符 和 debounce 操作符
1)、作用
只發射給 觀察者的 規定時間內 最後一個數據。
2)、程式碼
/**
* debounce 操作符 和 throttleWithTimeout 操作符
*/
@SuppressLint("CheckResult")
private void debounceAndThrottleWithTimeoutMethod() {
//intervalRange : 開始數字為 1 數字數量為90 初始延遲1毫秒 數字間隔為100毫秒
Observable.intervalRange(1,90,1,100, TimeUnit.MILLISECONDS)
.debounce(101, TimeUnit.MILLISECONDS)
.subscribe(new Consumer<Long>() {
@Override
public void accept(Long aLong) throws Exception {
logDUtils("accept:" + aLong);
}
});
}
3)、效果
8、elementAt 操作符
1)、作用
獲取指定索引處的 資料
2)、程式碼
/**
* elementAt 操作符
*/
@SuppressLint("CheckResult")
private void elementAtMethod() {
Observable.just(1, 2, 3, 4, 5, 6, 7).elementAt(4).subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
logDUtils("accept:" + integer);
}
});
}
#####3)、效果
注意: 初始索引為 0
9、firstElement 操作符 和 lastElement 操作符
1)、作用
firstElement :獲取首個 資料
lastElement :獲取最後一個數據
2)、程式碼
/**
* firstElement 操作符 和 lastElement 操作符
*/
@SuppressLint("CheckResult")
private void firstElementAndLastElementMethod() {
Observable.just("首個", "a", "b", "c").firstElement().subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
logDUtils("accept:" + s);
}
});
}
3)、效果
10、elementAtOrError操作符
作用
與 elementAt 操作符配合使用,當出現越界的情況 丟擲異常。