前言
前面已經(jīng)講了Rxjava相關(guān)基礎(chǔ)以及基本使用,有不清楚的童鞋可以看Rxjava實(shí)踐之路[入門篇]。本章主要講過濾,如何從發(fā)射的Observable中選取想要的內(nèi)容以及學(xué)會(huì)更多有用的處理技巧。
正題
1、filter
- 篩選符合條件的內(nèi)容
/**
* 篩選符合條件的內(nèi)容
* @author leibing
* @createTime 2016/09/18
* @lastModify 2016/09/18
* @param
* @return
*/
private void filterObservable(){
// 使用filter方法過濾內(nèi)容中不需要的值
Observable.just("A1","B1","A2","C3").filter(new Func1<String, Boolean>() {
@Override
public Boolean call(String s) {
// 條件篩選以“A”開始的內(nèi)容
return s.startsWith("A");
}
}).subscribe(new Action1<String>() {
@Override
public void call(String s) {
// 打印結(jié)果
System.out.println("ddddddddddddddddddd filter s = " + s);
}
});
}
運(yùn)行結(jié)果如下:
09-18 14:32:29.978 25356-25356/cn.jianke.rxjavafilterdemo I/System.out: ddddddddddddddddddd filter s = A1
09-18 14:32:29.978 25356-25356/cn.jianke.rxjavafilterdemo I/System.out: ddddddddddddddddddd filter s = A2
2、take
- 篩選出原始數(shù)據(jù)中前n個(gè)數(shù)據(jù)發(fā)射
/**
* 篩選出原始數(shù)據(jù)中前n個(gè)數(shù)據(jù)發(fā)射
* @author leibing
* @createTime 2016/09/18
* @lastModify 2016/09/18
* @param
* @return
*/
private void takeObservable(){
// take(n) 提取原數(shù)據(jù)前n個(gè)數(shù)據(jù)發(fā)射
Observable.just("1","2","3","4","5").take(4).subscribe(new Action1<String>() {
@Override
public void call(String s) {
// 打印結(jié)果
System.out.println("ddddddddddddddd take s = " + s);
}
});
}
運(yùn)行結(jié)果如下:
09-18 14:46:21.894 424-424/cn.jianke.rxjavafilterdemo I/System.out: ddddddddddddddd take s = 1
09-18 14:46:21.894 424-424/cn.jianke.rxjavafilterdemo I/System.out: ddddddddddddddd take s = 2
09-18 14:46:21.894 424-424/cn.jianke.rxjavafilterdemo I/System.out: ddddddddddddddd take s = 3
09-18 14:46:21.895 424-424/cn.jianke.rxjavafilterdemo I/System.out: ddddddddddddddd take s = 4
3、takelast
- 篩選出原始數(shù)據(jù)中從倒數(shù)前n個(gè)數(shù)據(jù)發(fā)射
/**
* 篩選出原始數(shù)據(jù)中從倒數(shù)前n個(gè)數(shù)據(jù)發(fā)射
* @author leibing
* @createTime 2016/09/18
* @lastModify 2016/09/18
* @param
* @return
*/
private void takeLastObservable(){
// takeLast(n) 提取原數(shù)據(jù)倒數(shù)前n個(gè)數(shù)據(jù)發(fā)射
Observable.just("1","2","3","4","5").takeLast(2).subscribe(new Action1<String>() {
@Override
public void call(String s) {
// 打印結(jié)果
System.out.println("dddddddddddddddddd takeLast s = " + s);
}
});
}
4、distinct
- 去掉數(shù)據(jù)中重復(fù)值
/**
* 去掉數(shù)據(jù)中重復(fù)值
* @author leibing
* @createTime 2016/09/18
* @lastModify 2016/09/18
* @param
* @return
*/
private void distinctObservable(){
// 將發(fā)射數(shù)據(jù)重復(fù)五遍再去重復(fù)
Observable.just("A1","A1","B1","C1","D1","B1","A1").repeat(5).distinct().subscribe(new Action1<String>() {
@Override
public void call(String s) {
// 打印結(jié)果
System.out.println("ddddddddddddddddd distinct s = " + s);
}
});
}
運(yùn)行結(jié)果如下:
09-18 14:54:35.616 6187-6187/cn.jianke.rxjavafilterdemo I/System.out: ddddddddddddddddd distinct s = A1
09-18 14:54:35.616 6187-6187/cn.jianke.rxjavafilterdemo I/System.out: ddddddddddddddddd distinct s = B1
09-18 14:54:35.617 6187-6187/cn.jianke.rxjavafilterdemo I/System.out: ddddddddddddddddd distinct s = C1
09-18 14:54:35.617 6187-6187/cn.jianke.rxjavafilterdemo I/System.out: ddddddddddddddddd distinct s = D1
5、skip
- 篩選出原始數(shù)據(jù)中前n個(gè)數(shù)據(jù)跳過不發(fā)射
/**
* 篩選出原始數(shù)據(jù)中前n個(gè)數(shù)據(jù)跳過不發(fā)射
* @author leibing
* @createTime 2016/09/18
* @lastModify 2016/09/18
* @param
* @return
*/
private void skipObservable(){
// skip(n) 提取原數(shù)據(jù)前n個(gè)數(shù)據(jù)跳過不發(fā)射
Observable.just("1","2","3","4","5").skip(4).subscribe(new Action1<String>() {
@Override
public void call(String s) {
// 打印結(jié)果
System.out.println("ddddddddddddddd skip s = " + s);
}
});
}
運(yùn)行結(jié)果如下:
09-18 15:04:10.187 11687-11687/cn.jianke.rxjavafilterdemo I/System.out: ddddddddddddddd skip s = 5
6、skiplast
- 篩選出原始數(shù)據(jù)中從倒數(shù)前n個(gè)數(shù)據(jù)跳過不發(fā)射
/**
* 篩選出原始數(shù)據(jù)中從倒數(shù)前n個(gè)數(shù)據(jù)跳過不發(fā)射
* @author leibing
* @createTime 2016/09/18
* @lastModify 2016/09/18
* @param
* @return
*/
private void skipLastObservable(){
// takeLast(n) 提取原數(shù)據(jù)倒數(shù)前n個(gè)數(shù)據(jù)跳過不發(fā)射
Observable.just("1","2","3","4","5").skipLast(2).subscribe(new Action1<String>() {
@Override
public void call(String s) {
// 打印結(jié)果
System.out.println("dddddddddddddddddd skipLast s = " + s);
}
});
}
運(yùn)行結(jié)果如下:
09-18 15:05:31.576 11687-11687/cn.jianke.rxjavafilterdemo I/System.out: dddddddddddddddddd skipLast s = 1
09-18 15:05:31.577 11687-11687/cn.jianke.rxjavafilterdemo I/System.out: dddddddddddddddddd skipLast s = 2
09-18 15:05:31.578 11687-11687/cn.jianke.rxjavafilterdemo I/System.out: dddddddddddddddddd skipLast s = 3
7、timeout
- 在指定的時(shí)間間隔內(nèi)Observable不發(fā)射值的話,監(jiān)聽的原始的Observable時(shí)就會(huì)觸發(fā)onError()函數(shù)
/**
* 在指定的時(shí)間間隔內(nèi)Observable不發(fā)射值的話,監(jiān)聽的原始的Observable時(shí)就會(huì)觸發(fā)onError()函數(shù)
* @author leibing
* @createTime 2016/09/18
* @lastModify 2016/09/18
* @param
* @return
*/
private void timeoutObservable(){
// 指定4秒后再發(fā)射,再指定3秒后如果未發(fā)射就觸發(fā)onError函數(shù)
Observable.just("1","2").timer(4, TimeUnit.SECONDS).timeout(3, TimeUnit.SECONDS).subscribe(
new Observer<Long>() {
@Override
public void onCompleted() {
System.out.println("dddddddddddddddd timeout onCompleted = ");
}
@Override
public void onError(Throwable e) {
System.out.println("dddddddddddddddd timeout e = " + e.getMessage());
}
@Override
public void onNext(Long aLong) {
System.out.println("dddddddddddddddd timeout along = " + aLong);
}
});
}
運(yùn)行結(jié)果如下:
09-18 15:28:34.142 25661-25812/cn.jianke.rxjavafilterdemo I/System.out: dddddddddddddddd timeout e = null
demo地址:RxjavaFilterDemo
總結(jié)
目前筆者覺得以上七種過濾比較實(shí)用,在此拋磚引玉,歡迎閱讀此文章的童鞋拍磚,多多指教!下章準(zhǔn)備寫Rxjava Observable變換的實(shí)踐總結(jié)!敬請(qǐng)關(guān)注!
作者
- github:leibing@github
- email:leibing1989@126.com
- qq:872721111