RxJava進階一(創(chuàng)建類操作符)
RxJava進階二(轉(zhuǎn)換類操作符)
RxJava進階三(過濾類操作符)
RxJava進階四(組合類操作符)
前言
上篇文章我們了解了RXJava的轉(zhuǎn)換類操作符,本篇文章帶著大家熟悉一下RxJava的過濾類操作符,本系列文章僅是帶大家認識一下這些操作符的用法,并沒有對操作符進行多種形態(tài)的使用,具體的還需要大家在使用時注意~
操作符總覽
Debounce、Distinct、ElementAt、Filter、First、IgnoreElements、Last、Sample、Skip、SkipLast、Take、TakeLast...
具體使用介紹
Debounce
debounce操作符在源Observable產(chǎn)品一個結(jié)果時開始計時,如果在規(guī)定的間隔時間內(nèi)沒有別的結(jié)果產(chǎn)生或者在此期間調(diào)用了onCompleted,則發(fā)射數(shù)據(jù),否則忽略發(fā)射。
代碼示例:
Observable
.create((Observable.OnSubscribe<Integer>) subscriber -> {
try {
//產(chǎn)生結(jié)果的間隔時間分別為100、200、300...900毫秒
for (int i = 1; i < 10; i++) {
subscriber.onNext(i);
Thread.sleep(i * 100);
}
subscriber.onCompleted();
} catch (Exception e) {
subscriber.onError(e);
}
})
.debounce(400, TimeUnit.MILLISECONDS)
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
System.out.println(integer);
}
});
運行結(jié)果:
Distinct
去重,過濾掉重復數(shù)據(jù)項~
Observable
.just(1, 1, 2, 2, 3)
.distinct()
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
System.out.println(integer);
}
});
運行結(jié)果:
ElementAt##
取值,取特定位置的數(shù)據(jù)項,索引是從0開始的~
代碼示例:
Observable
.just(100, 101, 102, 103, 104)
.elementAt(4)
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
System.out.println("onNext -->" + integer);
}
});
運行結(jié)果:
Filter##
對發(fā)射的數(shù)據(jù)進行過濾,只發(fā)射符合條件的數(shù)據(jù)~
代碼示例:
Observable
.just(100, 101, 102, 103, 104)
.filter(new Func1<Integer, Boolean>() {
@Override
public Boolean call(Integer integer) {
return integer >= 102;
}
})
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
System.out.println("onNext -->" + integer);
}
});
運行結(jié)果:
First##
首項,只發(fā)射首項或滿足條件的首項數(shù)據(jù)~
示例代碼:
Observable
.just(100, 101, 102, 103, 104)
.first(new Func1<Integer, Boolean>() {
@Override
public Boolean call(Integer integer) {
return integer >= 102;
}
})
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
System.out.println("onNext -->" + integer);
}
});
運行結(jié)果:
Last##
末項,只發(fā)射末項或滿足條件的末項數(shù)據(jù)~
示例代碼:
Observable
.just(100, 101, 102, 103, 104)
.last(new Func1<Integer, Boolean>() {
@Override
public Boolean call(Integer integer) {
return integer <= 102;
}
})
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
System.out.println("onNext -->" + integer);
}
});
運行結(jié)果:
IgnoreElements##
忽略所有數(shù)據(jù),只保留終止通知(onError或onCompleted)~
示例代碼:
// ignoreElements
Observable
.just(100, 101, 102, 103, 104)
.ignoreElements()
.subscribe(new Subscriber<Integer>() {
@Override
public void onCompleted() {
System.out.println("onCompleted");
}
@Override
public void onError(Throwable e) {
System.out.println("onError");
}
@Override
public void onNext(Integer integer) {
System.out.println("onNext -->" + integer);
}
});
運行結(jié)果:
Sample##
取樣,定期掃描源Observable產(chǎn)生的數(shù)據(jù),發(fā)射最新的數(shù)據(jù)~
示例代碼:
Observable
.interval(100, TimeUnit.MILLISECONDS)
.sample(200, TimeUnit.MILLISECONDS)
.subscribe(new Action1<Long>() {
@Override
public void call(Long aLong) {
System.out.println(aLong);
}
});
運行結(jié)果:
截取的部分輸出結(jié)果,從輸出結(jié)果可以看出,每次發(fā)射的數(shù)據(jù)都是偶數(shù)~
Skip##
跳過前面的n項數(shù)據(jù)不進行處理~
示例代碼:
Observable
.just(1, 2, 3, 4, 5)
.skip(2)
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
System.out.println("onNext -->" + integer);
}
});
運行結(jié)果:
SkipLast##
跳過后面的n項數(shù)據(jù)不進行處理~
示例代碼:
Observable
.just(1, 2, 3, 4, 5)
.skipLast(2)
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
System.out.println("onNext -->" + integer);
}
});
運行結(jié)果:
Take##
與skip用法相反,保留前面的n項數(shù)據(jù)進行發(fā)射,而忽略后面的結(jié)果~
示例代碼:
Observable
.just(1, 2, 3, 4, 5)
.take(3)
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
System.out.println("onNext -->" + integer);
}
});
運行結(jié)果:
TakeLast##
與skipLast用法相反,只保留后面的n項數(shù)據(jù)進行發(fā)射,而忽略前面的結(jié)果~
示例代碼:
Observable
.just(1, 2, 3, 4, 5)
.takeLast(3)
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
System.out.println("onNext -->" + integer);
}
});
運行結(jié)果:
結(jié)語
過濾類操作符,就簡單介紹到這里,希望能夠?qū)ν瑢W有所幫助,謝謝~