RxJava操作符系列三(下)
接上文
Take
Take操作符可以修改Observable的行為,只返回前面的N項(xiàng)數(shù)據(jù),然后發(fā)射完成通知,忽略剩余的數(shù)據(jù)。
- Observable.range(1,8)
- .take(4)
- .subscribe(new Subscriber<Integer>() {
- @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一樣也有其它兩個(gè)重載方法take(long time, TimeUnit unit),take(long time, TimeUnit unit, Scheduler scheduler),默認(rèn)在computation調(diào)度器上執(zhí)行。
take還有變體操作符TakeLast,takeLastBuffer具體執(zhí)行效果可自行代碼。
Debounce
該操作符指的是過(guò)了一段指定的時(shí)間還沒(méi)發(fā)射數(shù)據(jù)時(shí)才發(fā)射一個(gè)數(shù)據(jù),聽(tīng)著可能有點(diǎn)繞。你可以理解對(duì)源Observable間隔期產(chǎn)生的結(jié)果進(jìn)行過(guò)濾,如果在這個(gè)規(guī)定的間隔期內(nèi)沒(méi)有別的結(jié)果產(chǎn)生,則將這個(gè)結(jié)果提交給訂閱者,否則忽略該結(jié)果,原理有點(diǎn)像光學(xué)防抖
上代碼
- Observable.range(1,8)
- .take(4)
- .subscribe(new Subscriber<Integer>() {
- @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:
這個(gè)輸出數(shù)據(jù)不一定一樣,有可能從5開(kāi)始。
Distinct
這個(gè)比較好理解,它就是過(guò)濾掉重復(fù)的數(shù)據(jù),只允許還沒(méi)有發(fā)射過(guò)的數(shù)據(jù)項(xiàng)通過(guò)。
示例代碼
- Observable.just(0, 0, 6, 4, 2, 8, 2, 1, 9, 0)
- .distinct()
- .subscribe(new Subscriber<Integer>() {
- @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發(fā)射的數(shù)據(jù)序列指定索引位置的數(shù)據(jù)項(xiàng),然后當(dāng)做自己的***數(shù)據(jù)發(fā)射。給它傳遞一個(gè)基于0的索引值,它會(huì)發(fā)射原始Observable數(shù)據(jù)序列對(duì)應(yīng)索引位置的值,如果你傳遞給elementAt的值為4,那么它會(huì)發(fā)射第5項(xiàng)的數(shù)據(jù)。如下示例代碼
- Observable.just(0, 0, 6, 4, 2, 8, 2, 1, 9, 0)
- .elementAt(4)
- .subscribe(new Subscriber<Integer>() {
- @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發(fā)射的所有數(shù)據(jù),只允許它的終止通知(onError或onCompleted)通過(guò),使用該操作符onNext()方法不會(huì)執(zhí)行。
- 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");
- }
- });
執(zhí)行后只會(huì)輸出onCompleted。這個(gè)操作符效果就如同empty()方法創(chuàng)建一個(gè)空的Observable,只會(huì)執(zhí)行onCompleted()方法,不同的是ignoreElements是對(duì)數(shù)據(jù)源的處理,而empty()是創(chuàng)建Observable。