注:只包含標準包中的操作符,用于個人學習及備忘
參考博客:http://blog.csdn.net/maplejaw_/article/details/52396175
本篇將介紹rxjava中的創建操作、合并操作、過濾操作、條件/布爾操作、聚合操作、轉換操作以及變換操作,只針對用法不涉及原理,對RxJava不熟悉的可參考:http://gank.io/post/560e15be2dca930e00da1083
創建操作
-
create:使用OnSubscrib直接創建一個Observable
Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { subscriber.onNext("item1"); subscriber.onNext("item2"); subscriber.onCompleted(); } });
-
from:將數組或集合拆分成具體對象后,轉換成發送這些對象的Observable
String[] arr = {"item1", "item2", "item3"}; Observable.from(arr) .subscribe(new Action1<String>() { @Override public void call(String s) { Log.d("debug", s); //調用多次,分別打印出item1,item2,item3 } });
-
just:將一個或多個對象轉換成發送這些對象的Obserbable
Observable.just("item1","item2","item3") .subscribe(new Action1<String>() { @Override public void call(String s) { Log.d("debug", s); //調用多次,分別打印出item1,item2,item3 } });
empty:創建一個直接通知完成的Observable
error:創建一個直接通知錯誤的Observable
-
never:創建一個什么都不做的Observable
Observable observable1 = Observable.empty(); //直接調用onCompleted()方法 Observable observable2 = Observable.error(new RuntimeException()); //直接調用onError()方法 Observable observable3 = Observable.never(); //onNext(),onCompleted(),onError()均不調用
-
timer:創建一個延時發射數據的Observable
Observable.timer(1000, TimeUnit.MILLISECONDS) .subscribe(new Action1<Long>() { @Override public void call(Long aLong) { Log.d("debug", aLong.toString()); //aLong為0 } });
-
interval:創建一個按照給定的時間間隔發射送0開始的整數序列的Obervable
Observable.interval(2, 1, TimeUnit.SECONDS) .subscribe(new Action1<Long>() { @Override public void call(Long aLong) { //等待2秒后開始發射數據,發射的時間間隔為1秒,從0開始計數 } }); Observable.interval(1, TimeUnit.SECONDS) .subscribe(new Action1<Long>() { @Override public void call(Long aLong) { //等待1秒后開始發射數據,發射的時間間隔為1秒,從0開始計數 //相當于Observable.interval(1, 1, TimeUnit.SECONDS) } });
-
range:創建一個發射指定范圍的整數序列的Observable
Observable.range(3, 4) .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("debug", integer.toString());//依次發射3,4,5,6,從3開始發射4個數據 } });
-
defer:觀察者訂閱時才創建Observable,每次訂閱返回一個新的Observable
Observable.defer(new Func0<Observable<String>>() { @Override public Observable<String> call() { return Observable.just("s"); } }).subscribe(new Action1<String>() { @Override public void call(String s) { Log.d("debug", s); //打印s } });
合并操作(用于組合多個Observavle)
-
concat:按順序連接多個Observable,注:Observable.concat(a,b)等價于a.concatWith(b)
Observable<Integer> observable1 = Observable.just(1, 2, 3); Observable<Integer> observable2 = Observable.just(4, 5, 6); Observable.concat(observable1, observable2) .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("debug", integer.toString()); //打印1,2,3,4,5,6 } });
-
startWith:在數據序列的開頭增加一項數據,內部調用concat
Observable.just(1, 2, 3) .startWith(Observable.just(4, 5)) //添加一個Observable .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("debug", integer.toString()); //打印4,5,1,2,3 } }); Observable.just(1,2,3) .startWith(4,5) //添加多個數據 .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("debug", integer.toString()); //打印4,5,1,2,3 } }); List<Integer> integers = new ArrayList<>(); integers.add(4); integers.add(5); Observable.just(1,2,3) .startWith(integers) //添加一個集合 .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("debug", integer.toString()); //打印4,5,1,2,3 } });
merge / mergeDelayError:將多個Observable合并為一個。不同于concat,merge不是按照添加順序連接,而是按照時間線來連接。其中mergeDelayError將異常延遲到其它沒有錯誤的Observable發送完畢后才發射。而merge則是一遇到異常將停止發射數據,發送onError通知
Observable<Integer> observable1 = Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
subscriber.onNext(1);
SystemClock.sleep(1000);
subscriber.onNext(2);
subscriber.onNext(3);
subscriber.onCompleted();
}
}).subscribeOn(Schedulers.computation());
Observable<Integer> observable2 = Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
SystemClock.sleep(500);
subscriber.onNext(4);
subscriber.onNext(5);
SystemClock.sleep(1000);
subscriber.onNext(6);
subscriber.onCompleted();
}
}).subscribeOn(Schedulers.computation());
Observable.merge(observable1, observable2)
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
Log.d("debug", integer.toString()); //打印1,4,5,2,3,6
}
});
- zip:使用一個函數組合多個Observable發射的數據集合,再發射這個結果。如果多個Observable發射的數據量不一樣,則以最少的Observable為標準進行壓合
Observable<Integer> observable1 = Observable.just(1, 2, 3, 4, 5);
Observable<String> observable2 = Observable.just("A", "B", "C", "D");
Observable.zip(observable1, observable2, new Func2<Integer, String, String>() {
@Override
public String call(Integer integer, String s) {
return integer + s;
}
}).subscribe(new Action1<String>() {
@Override
public void call(String s) {
Log.d("debug", s); //打印1A,2B,3C,4D
}
});
- combineLatest:當兩個Observable中任何一個發射了一個數據時,通過一個指定的函數組合每個Observable發射的最新數據(一共兩個數據),然后發射這個函數的結果。類似于zip,但是,不同的是zip只有在每個Observable都發射了數據才工作,而combineLatest任何一個發射了數據都可以工作,每次與另一個Observable最近的數據壓合
Observable<Integer> observable1 = Observable.create(new Observable.OnSubscribe<Integer>() {
@Override
public void call(Subscriber<? super Integer> subscriber) {
subscriber.onNext(1);
SystemClock.sleep(500);
subscriber.onNext(2);
SystemClock.sleep(1000);
subscriber.onNext(3);
SystemClock.sleep(300);
subscriber.onNext(4);
SystemClock.sleep(500);
subscriber.onNext(5);
subscriber.onCompleted();
}
}).subscribeOn(Schedulers.computation());
Observable<String> observable2 = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
SystemClock.sleep(300);
subscriber.onNext("A");
SystemClock.sleep(300);
subscriber.onNext("B");
SystemClock.sleep(500);
subscriber.onNext("C");
subscriber.onNext("D");
subscriber.onCompleted();
}
}).subscribeOn(Schedulers.computation());
Observable.combineLatest(observable1, observable2, new Func2<Integer, String, String>() {
@Override
public String call(Integer integer, String s) {
return integer + s;
}
}).subscribe(new Action1<String>() {
@Override
public void call(String s) {
Log.d("debug", s); //打印1A,2A,2B,2C,2D,3D,4D,5D
}
});
過濾操作
-
filter:過濾數據
Observable.just(1, 2, 3, 4) .filter(new Func1<Integer, Boolean>() { @Override public Boolean call(Integer integer) { return integer % 2 == 0; //過濾偶數 } }) .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("debug", integer.toString()); //打印2,4 } });
-
ofType:過濾指定類型數據
Observable.just(1, "2", 3, "4") .ofType(Integer.class) //過濾整形數據 .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("debug", integer.toString()); //打印1,3 } });
-
take:只發射前n項數據或者一定時間內的數據(無需考慮索引越界問題,配合interval操作符可作為定時器使用)
Observable.just(1, 2, 3, 4) .take(2) //只發射前2項 .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("debug", integer.toString()); //打印1,2 } }); Observable.interval(1, TimeUnit.SECONDS) .take(3, TimeUnit.SECONDS) //只發射3秒內的數據 .subscribe(new Action1<Long>() { @Override public void call(Long aLong) { //打印0,1(打印出來的并不是相像中的0,1,2,應該與代碼代碼執行的時間有關,使用時需要注意?。? Log.d("debug", aLong.toString()); } });
-
takeLast:只發射最后的N項數據或者一定時間內的數據(無需考慮索引越界問題)
Observable.just(1, 2, 3, 4) .takeLast(3) //只發射后3項 .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("debug", integer.toString()); //打印2,3,4 } }); Observable.interval(1, TimeUnit.SECONDS) .take(10) //每1秒發射一個數據,發射10秒 .takeLast(3, TimeUnit.SECONDS) //只發射最后3秒的數據 .subscribe(new Action1<Long>() { @Override public void call(Long aLong) { Log.d("debug", aLong.toString()); //打印6,7,8,9(同樣存在些許誤差,使用時需注意!) } }); Observable.interval(1, TimeUnit.SECONDS) .take(10) .takeLast(2, 3, TimeUnit.SECONDS) //只發射最后3秒內的最后2個數據 .subscribe(new Action1<Long>() { @Override public void call(Long aLong) { Log.d("debug", aLong.toString()); //打印8,9 } });
-
takeFirst:只發射滿足條件的第一項(其實就是filter+take)
Observable.just(1, 2, 3, 4) .takeFirst(new Func1<Integer, Boolean>() { @Override public Boolean call(Integer integer) { return integer > 1; } }) .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("debug", integer.toString()); //打印2 } });
*first / firstOrDefault:只發射第一項或者滿足條件的第一項數據,其中firstOrDefault可以指定默認值(建議使用firstOrDefault,找不到對應元素時first會報異常)
Observable.just(1, 2, 3)
.first() //發射第一項
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
Log.d("debug", integer.toString()); //打印1
}
});
Observable.just(1, 2, 3, 4)
.first(new Func1<Integer, Boolean>() { //發射大于2的第一項
@Override
public Boolean call(Integer integer) {
return integer > 2;
}
})
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
Log.d("debug", integer.toString()); //打印3
}
});
Integer[] arr = {};
Observable.from(arr)
.firstOrDefault(2) //發射第一項,沒有可發射的數據時,發射默認值2
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
Log.d("debug", integer.toString()); //打印2
}
});
-
last / lastOrDefault:只發射最后一項或滿足條件的最后一項,其中lastOrDefault可以指定默認值
Observable.just(1, 2, 3) .last() //發射最后一項 .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("debug", integer.toString()); //打印3 } }); Observable.just(1, 2, 3, 4) .last(new Func1<Integer, Boolean>() { //發射大于2的最后一項 @Override public Boolean call(Integer integer) { return integer > 2; } }) .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("debug", integer.toString()); //打印4 } }); Integer[] arr = {}; Observable.from(arr) .lastOrDefault(2) //發射最后一項,沒有可發射的數據時,發射默認值2 .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("debug", integer.toString()); //打印2 } });
-
skip:跳過開始的n項數據或者一定時間內的數據(與take類似)
Observable.just(1, 2, 3, 4) .skip(2) //跳過前2項 .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("debug", integer.toString()); //打印3,4 } }); Observable.interval(1, TimeUnit.SECONDS) .take(5) .skip(3, TimeUnit.SECONDS) //跳過前3秒 .subscribe(new Action1<Long>() { @Override public void call(Long aLong) { Log.d("debug", aLong.toString()); //打印2,3,4,同樣存在誤差! } });
-
skipLast:跳過最后的n項數據或一定時間內的數據
Observable.just(1, 2, 3, 4) .skipLast(2) //跳過最后2項 .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("debug", integer.toString()); //打印1,2 } }); Observable.interval(1, TimeUnit.SECONDS) .take(7) .skipLast(3, TimeUnit.SECONDS) //跳過最后3秒 .subscribe(new Action1<Long>() { @Override public void call(Long aLong) { Log.d("debug", aLong.toString()); //打印0,1,2,同樣存在誤差! } });
-
elementAt / elementAtOrDefault:發射某一項數據,其中elementAtOrDefault可以指定索引越界時發射的默認值
Observable.just(1, 2, 3, 4) .elementAt(2) //發射索引為2的數據 .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("debug", integer.toString()); //打印3 } }); Observable.just(1, 2, 3) .elementAtOrDefault(4, 5) //發射索引為4的數據,索引越界時發射默認數據5 .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("debug", integer.toString()); //打印5 } });
ignoreElements:丟棄所有數據,只發射錯誤或正常終止的通知,即只觸發觀察者的onError()或onCompleted()方法
-
distinct:過濾重復數據,可指定判定唯一的標準
Observable.just(1, 1, 2, 3, 2, 4) .distinct() .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("debug", integer.toString()); //打印1,2,3,4 } }); Observable.just(1, 1, 2, 3, 2, 4) //根據發射的數據生成對應的key,通過key值來判斷唯一,如果兩個數據的key相同,則只發射第一個 .distinct(new Func1<Integer, Integer>() { @Override public Integer call(Integer integer) { //奇數對應的key為1,偶數對應的key為2 if (integer % 2 == 0) { return 2; } return 1; } }) .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("debug", integer.toString()); //打印1,2 } });
-
distinctUntilChanged:過濾掉連續重復的數據,可指定判定唯一的標準
Observable.just(1, 1, 2, 3, 2, 4) .distinctUntilChanged() .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("debug", integer.toString()); //打印1,2,3,2,4 } }); Observable.just(1, 1, 2, 3, 2, 4) //根據發射的數據生成對應的key,通過key值來判斷唯一,如果兩個數據的key相同,則只發射第一個 .distinctUntilChanged(new Func1<Integer, Integer>() { @Override public Integer call(Integer integer) { //奇數對應的key為1,偶數對應的key為2 if (integer % 2 == 0) { return 2; } return 1; } }) .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("debug", integer.toString()); //打印1,2,3,2 } }); Observable.just(1, 1, 2, 3, 2, 4) //傳入比較器的方式 .distinctUntilChanged(new Func2<Integer, Integer, Boolean>() { @Override public Boolean call(Integer integer, Integer integer2) { return integer % 2 == integer2 % 2; //同為奇數或偶數返回true } }) .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("debug", integer.toString()); //打印1,2,3,2 } });
-
throttleFirst:定期發射Observable在該時間段發射的第一項數據
Observable.interval(0, 500, TimeUnit.MILLISECONDS) .take(10) //每500毫秒發射一次數據,發射10次 .throttleFirst(1000, TimeUnit.MILLISECONDS) //每1秒發射該秒內發射數據中的第一項數據 .subscribe(new Action1<Long>() { @Override public void call(Long aLong) { //打印0,2,5,8(即第一秒發射0,1,第二秒發射2,3,4,第三秒發射5,6,7,第四秒發射8,9),同樣存在誤差! Log.d("debug", aLong.toString()); } });
-
throttleWithTimeout / debounce(兩者使用及效果相同):發射數據時,如果兩次數據的發射間隔小于指定時間,就會丟棄前一次的數據,直到指定時間內都沒有新數據發射時才進行發射
Observable.create(new Observable.OnSubscribe<Integer>() { @Override public void call(Subscriber<? super Integer> subscriber) { //依次發射1-6,發射間隔不同 subscriber.onNext(1); SystemClock.sleep(500); subscriber.onNext(2); SystemClock.sleep(500); subscriber.onNext(3); SystemClock.sleep(1000); subscriber.onNext(4); SystemClock.sleep(1000); subscriber.onNext(5); SystemClock.sleep(500); subscriber.onNext(6); subscriber.onCompleted(); } }).throttleWithTimeout(700, TimeUnit.MILLISECONDS) //指定最小發射間隔時間為700毫秒 .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("debug", integer.toString()); //打印3,4,6 } });
-
sample / throttleLast(兩者使用及效果相同):定期發射Observable在該時間段發射的最后一項數據,與throttleFirst相反
Observable.interval(0, 500, TimeUnit.MILLISECONDS) .take(10) //每500毫秒發射一次數據,發射10次 .throttleLast(1000, TimeUnit.MILLISECONDS) //每1秒發射該秒內發射數據中的最后一項數據 .subscribe(new Action1<Long>() { @Override public void call(Long aLong) { //打印1,3,5,7,9(即第一秒發射0,1,第二秒發射2,3,第三秒發射4,5,第四秒發射6,7,第五秒發射8,9) Log.d("debug", aLong.toString()); } });
-
timeout:如果指定時間內沒有發射任何數據,就發射一個異?;蛘呤褂脗溆玫腛bservavle
Observable.timer(5, TimeUnit.SECONDS) .timeout(3, TimeUnit.SECONDS) //超時則發射異常 .subscribe(new Subscriber<Long>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { Log.d("debug", "onError()"); //拋出異常 } @Override public void onNext(Long aLong) { Log.d("debug", aLong.toString()); } }); Observable.timer(5, TimeUnit.SECONDS) .timeout(3, TimeUnit.SECONDS, Observable.just(2L)) //設置備用Observable .subscribe(new Subscriber<Long>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { Log.d("debug", "onError()"); } @Override public void onNext(Long aLong) { Log.d("debug", aLong.toString()); //發射備用Observable,打印2 } });
條件 / 布爾操作
-
all:判斷所有數據中是否都滿足某個條件
Observable.just(1, 2, 3, 4) .all(new Func1<Integer, Boolean>() { @Override public Boolean call(Integer integer) { return integer < 5;//所有項都小于5 } }) .subscribe(new Action1<Boolean>() { @Override public void call(Boolean aBoolean) { Log.d("debug", aBoolean.toString()); //打印true } }); Observable.just(1, 2, 3, 4) .all(new Func1<Integer, Boolean>() { @Override public Boolean call(Integer integer) { return integer > 2;//所有項都大于2 } }) .subscribe(new Action1<Boolean>() { @Override public void call(Boolean aBoolean) { Log.d("debug", aBoolean.toString()); //打印false } });
-
exists:判斷是否存在數據項滿足某個條件
Observable.just(1, 2, 3, 4) .exists(new Func1<Integer, Boolean>() { @Override public Boolean call(Integer integer) { return integer > 2; //存在某項大于2 } }) .subscribe(new Action1<Boolean>() { @Override public void call(Boolean aBoolean) { Log.d("debug", aBoolean.toString()); //打印true } });
-
contains:判斷所有數據中是否包含指定的數據(內部調用exists)
Observable.just(1, 2, 3, 4) .contains(2) //是否包含2 .subscribe(new Action1<Boolean>() { @Override public void call(Boolean aBoolean) { Log.d("debug", aBoolean.toString()); //打印true } });
-
sequenceEqual:判斷兩個Observable發射的數據是否相同(數據,發射順序,終止狀態)
Observable.sequenceEqual(Observable.just(1, 2, 3), Observable.just(1, 2, 3)) .subscribe(new Action1<Boolean>() { @Override public void call(Boolean aBoolean) { Log.d("debug", aBoolean.toString()); //打印true } });
-
isEmpty:用于判斷Observable是否沒有發射任何數據(發射null返回為false)
Observable.from(new ArrayList<Integer>()) //集合中沒有數據 .isEmpty() .subscribe(new Action1<Boolean>() { @Override public void call(Boolean aBoolean) { Log.d("debug", aBoolean.toString()); //打印true } }); Observable.empty() .isEmpty() .subscribe(new Action1<Boolean>() { @Override public void call(Boolean aBoolean) { Log.d("debug", aBoolean.toString()); //打印true } });
-
amber:指定多個Observable,只允許第一個開始發射數據的Observable發射全部數據,其他Observable將會被會忽略
Observable<Integer> observable1 = Observable.create(new Observable.OnSubscribe<Integer>() { @Override public void call(Subscriber<? super Integer> subscriber) { SystemClock.sleep(500); //延遲500毫秒 subscriber.onNext(1); subscriber.onNext(2); subscriber.onCompleted(); } }.subscribeOn(Schedulers.computation())); //指定為新的線程 Observable<String> observable2 = Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { subscriber.onNext("a"); subscriber.onNext("b"); subscriber.onCompleted(); } }); Observable.amb(observable1, observable2) .subscribe(new Action1<Serializable>() { @Override public void call(Serializable serializable) { Log.d("debug", serializable.toString()); //打印a,b } });
-
switchIfEmpty:如果原始Observable正常終止后仍沒有發射任何數據,就使用備用的Observable
Observable.from(new ArrayList<Integer>()) .switchIfEmpty(Observable.just(1, 2)) .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("debug", integer.toString()); //打印1,2 } });
-
defaultIfEmpty:如果原始Observable正常終止后仍沒有發射任何數據,就發射一個默認值(內部調用switchIfEmpty)
Observable.from(new ArrayList<Integer>()) .defaultIfEmpty(1) .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("debug", integer.toString()); //打印1 } });
-
takeUntil:當發射的數據滿足某個條件后(包含該數據),或者第二個Observable發射了一項數據或發射了一個終止通知時(觀察者接受不到第二個Observable發射的數據),終止第一個Observable發送數據
Observable.just(1, 2, 3, 4) .takeUntil(new Func1<Integer, Boolean>() { @Override public Boolean call(Integer integer) { return integer == 3; } }) .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("debug", "just" + integer.toString()); //打印1,2,3 } }); Observable.interval(0, 500, TimeUnit.MILLISECONDS) .subscribeOn(Schedulers.computation()) .takeUntil(Observable.timer(1200, TimeUnit.MILLISECONDS)) .subscribe(new Action1<Long>() { @Override public void call(Long aLong) { Log.d("debug", aLong.toString()); //打印0,1,2 } });
-
takeWhile:當發射的數據對應某個條件為false時(不包含該數據),Observable終止發送數據
Observable.just(1, 2, 3, 4) .takeWhile(new Func1<Integer, Boolean>() { @Override public Boolean call(Integer integer) { return integer != 3; } }) .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("debug", integer.toString()); //打印1,2 } });
-
skipUnit:丟棄Observable發射的數據,直到第二個Observable開始發射數據或者發射一個終止通知時
Observable.interval(0, 500, TimeUnit.MILLISECONDS) .take(5) .subscribeOn(Schedulers.computation()) .skipUntil(Observable.timer(1200, TimeUnit.MILLISECONDS)) .subscribe(new Action1<Long>() { @Override public void call(Long aLong) { Log.d("debug", aLong.toString()); //打印3,4 } });
-
skipWhile:丟棄Observable發射的數據,直到一個指定的條件不成立(不丟棄條件數據)
Observable.just(1, 2, 3, 4) .skipWhile(new Func1<Integer, Boolean>() { @Override public Boolean call(Integer integer) { return integer < 3; } }) .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("debug", integer.toString()); //打印3,4 } });
聚合操作
-
reduce:用一個函數接收Observable發射的數據,將函數的計算結果作為下次計算的參數,最后輸出結果。
Observable.just(1, 2, 3, 4) .reduce(new Func2<Integer, Integer, Integer>() { @Override public Integer call(Integer integer, Integer integer2) { Log.d("debug", "integer1:" + integer + ",integer2:" + integer2); return integer + integer2; //求和操作 } }) .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("debug", "result:" + integer); } }); /** * 日志輸出 * integer1:1,integer2:2 * integer1:3,integer2:3 * integer1:6,integer2:4 * result:10 */
-
collect:用于將數據收集到一個可變的數據結構(如List,Map)
Observable.just(1, 2, 3, 4) .collect(new Func0<List<Integer>>() { @Override public List<Integer> call() { return new ArrayList<Integer>(); //創建List用于收集數據 } }, new Action2<List<Integer>, Integer>() { @Override public void call(List<Integer> integers, Integer integer) { integers.add(integer); //將數據添加到List中 } }) .subscribe(new Action1<List<Integer>>() { @Override public void call(List<Integer> integers) { Log.d("debug", integers.toString()); //打印[1, 2, 3, 4] } }); Observable.just(1, 2, 3, 4) .collect(new Func0<Map<Integer, String>>() { @Override public Map<Integer, String> call() { return new HashMap<Integer, String>(); //創建Map用于收集數據 } }, new Action2<Map<Integer, String>, Integer>() { @Override public void call(Map<Integer, String> integerStringMap, Integer integer) { integerStringMap.put(integer, "value" + integer); //將數據添加到Map中 } }) .subscribe(new Action1<Map<Integer, String>>() { @Override public void call(Map<Integer, String> integerStringMap) { //打印{4=value4, 1=value1, 3=value3, 2=value2},注:HashMap保存的數據是無序的 Log.d("debug", integerStringMap.toString()); } });
-
count / countLong:計算發射的數量,內部調用的是reduce
Observable.just(1, 2, 3, 4) .count() .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("debug", "integer:" + integer.toString()); //打印4 } });
轉換操作
-
toList:將Observable發射的所有數據收集到一個列表中,返回這個列表
Observable.just(1, 2, 3, 4) .toList() .subscribe(new Action1<List<Integer>>() { @Override public void call(List<Integer> integers) { Log.d("debug", integers.toString()); //打印[1, 2, 3, 4] } });
-
toSortedList:將Observable發射的所有數據收集到一個有序列表中,返回這個列表
Observable.just(3, 2, 5, 4, 1) .toSortedList() //默認升序排序 .subscribe(new Action1<List<Integer>>() { @Override public void call(List<Integer> integers) { Log.d("debug", integers.toString()); //打印[1, 2, 3, 4, 5] } }); Observable.just(3, 2, 5, 4, 1) .toSortedList(new Func2<Integer, Integer, Integer>() { @Override public Integer call(Integer integer, Integer integer2) { return integer2 - integer; //自定義排序規則(倒序) } }) .subscribe(new Action1<List<Integer>>() { @Override public void call(List<Integer> integers) { Log.d("debug", integers.toString()); //打印[5, 4, 3, 2, 1] } });
-
toMap:將序列數據轉換為一個Map,根據數據項生成key和value
Observable.just(1, 2, 3, 4) .toMap(new Func1<Integer, String>() { //根據數據項生成key,value為原始數據 @Override public String call(Integer integer) { return "key:" + integer; } }) .subscribe(new Action1<Map<String, Integer>>() { @Override public void call(Map<String, Integer> stringIntegerMap) { Log.d("debug", stringIntegerMap.toString()); //打印{key:4=4, key:2=2, key:1=1, key:3=3} } }); Observable.just(1, 2, 3, 4) .toMap(new Func1<Integer, String>() { //根據數據項生成key和value @Override public String call(Integer integer) { return "key:" + integer; } }, new Func1<Integer, String>() { @Override public String call(Integer integer) { return "value:" + integer; } }) .subscribe(new Action1<Map<String, String>>() { @Override public void call(Map<String, String> stringStringMap) { Log.d("debug", stringStringMap.toString()); //打印{key:4=value:4, key:2=value:2, key:1=value:1, key:3=value:3} } }); Observable.just(1, 2, 3, 4) .toMap(new Func1<Integer, String>() { //根據數據項生成key和value,創建指定類型的Map @Override public String call(Integer integer) { return "key:" + integer; } }, new Func1<Integer, String>() { @Override public String call(Integer integer) { return "value:" + integer; } }, new Func0<Map<String, String>>() { @Override public Map<String, String> call() { return new LinkedHashMap<String, String>(); //LinkedHashMap保證存取順序相同 } }) .subscribe(new Action1<Map<String, String>>() { @Override public void call(Map<String, String> stringStringMap) { Log.d("debug", stringStringMap.toString()); //打印{key:1=value:1, key:2=value:2, key:3=value:3, key:4=value:4} } });
-
toMultiMap:類似toMap,不同的地方在于map的value是一個集合,使一個key可以映射多個value,多用于分組
Observable.just(1, 2, 1, 4) .toMultimap(new Func1<Integer, String>() { //根據數據項生成key,value為原始數據 @Override public String call(Integer integer) { return "key:" + integer; } }) .subscribe(new Action1<Map<String, Collection<Integer>>>() { @Override public void call(Map<String, Collection<Integer>> stringCollectionMap) { Log.d("debug", stringCollectionMap.toString()); //打印{key:4=[4], key:2=[2], key:1=[1, 1]} } }); Observable.just(1, 2, 1, 4) .toMap(new Func1<Integer, String>() { @Override public String call(Integer integer) { return "key:" + integer; } }) .subscribe(new Action1<Map<String, Integer>>() { @Override public void call(Map<String, Integer> stringIntegerMap) { Log.d("debug", stringIntegerMap.toString()); //打印{key:4=4, key:2=2, key:1=1} } });
變換操作
-
map:對Observable發射的每一項數據都應用一個函數進行變換
Observable.just(1, 2, 3, 4) .map(new Func1<Integer, String>() { @Override public String call(Integer integer) { return "item:" + integer; } }) .subscribe(new Action1<String>() { @Override public void call(String s) { Log.d("debug", s); //打印item:1,item:2,item:3,item:4 } });
-
cast:在發射之前強制將Observable發射的所有數據轉換為指定類型(父類強轉為子類)
List list = new ArrayList(); Observable.just(list) .cast(ArrayList.class) //將List強轉為ArrayList .subscribe(new Action1<ArrayList>() { @Override public void call(ArrayList arrayList) { } });
-
flatMap:將Observable發射的數據變換為Observables集合,然后將這些Observable發射的數據平坦化的放進一個單獨的Observable,內部使用marge合并(可用于一對多轉換或多對多轉換,也可用于網絡請求的嵌套)
Observable.just(1, 2, 3) .flatMap(new Func1<Integer, Observable<Integer>>() { @Override public Observable<Integer> call(Integer integer) { return Observable.create(new Observable.OnSubscribe<Integer>() { @Override public void call(Subscriber<? super Integer> subscriber) { subscriber.onNext(integer * 10); subscriber.onNext(integer * 100); subscriber.onCompleted(); } }); } }) .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("debug", integer.toString()); //打印10,100,20,200,30,300 } });
-
flatMapIterable:和flatMap作用一樣,只不過生成的是Iterable而不是Observable
Observable.just(1, 2, 3) .flatMapIterable(new Func1<Integer, Iterable<Integer>>() { @Override public Iterable<Integer> call(Integer integer) { return Arrays.asList(integer * 10, integer * 100); } }) .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("debug", integer.toString()); //打印10,100,20,200,30,300 } });
concatMap:類似于flatMap,由于內部使用concat合并,所以是按照順序連接發射
-
switchMap:和flatMap很像,將Observable發射的數據變換為Observables集合,當原始Observable發射一個新的數據(Observable)時,它將取消訂閱前一個Observable
Observable.interval(0, 500, TimeUnit.MILLISECONDS) //每500毫秒發射一次 .take(4) .switchMap(new Func1<Long, Observable<String>>() { @Override public Observable<String> call(Long aLong) { return Observable.create(new Observable.OnSubscribe<String>() { @Override public void call(Subscriber<? super String> subscriber) { subscriber.onNext(aLong + "A"); SystemClock.sleep(800); //延遲800毫秒 subscriber.onNext(aLong + "B"); subscriber.onCompleted(); } }).subscribeOn(Schedulers.newThread()); } }) .subscribe(new Action1<String>() { @Override public void call(String s) { Log.d("debug", s); //打印0A,1A,2A,3A,3B } });
-
與reduce很像,對Observable發射的每一項數據應用一個函數,然后按順序依次發射每一個值
Observable.just(1, 2, 3, 4) .scan(new Func2<Integer, Integer, Integer>() { @Override public Integer call(Integer integer, Integer integer2) { Log.d("debug", "integer1:" + integer + ",integer2:" + integer2); return integer + integer2; } }) .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("debug", "result:" + integer); } }); /** * 日志輸出 * result:1 * integer1:1,integer2:2 * result:3 * integer1:3,integer2:3 * result:6 * integer1:6,integer2:4 * result:10 */
-
groupBy:將Observable分拆為Observable集合,將原始Observable發射的數據按Key分組,每個Observable發射一組不同的數據(類似于toMultiMap)
Observable.just(1, 2, 3, 4) .groupBy(new Func1<Integer, String>() { @Override public String call(Integer integer) { //根據數據項生成key return integer % 2 == 0 ? "偶數" : "奇數"; } }) .subscribe(new Action1<GroupedObservable<String, Integer>>() { @Override public void call(GroupedObservable<String, Integer> o) { o.subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("debug", o.getKey() + ":" + integer); //打印奇數:1,偶數:2,奇數:3,偶數:4 } }); } }); Observable.just(1, 2, 3, 4) .groupBy(new Func1<Integer, String>() { @Override public String call(Integer integer) { //根據數據項生成key return integer % 2 == 0 ? "偶數" : "奇數"; } }, new Func1<Integer, Integer>() { @Override public Integer call(Integer integer) { //根據數據項生成value return integer * 10; } }) .subscribe(new Action1<GroupedObservable<String, Integer>>() { @Override public void call(GroupedObservable<String, Integer> o) { o.subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.d("debug", o.getKey() + ":" + integer); //打印奇數:10,偶數:20,奇數:30,偶數:40 } }); } });
-
buffer:定期從Observable收集數據到一個集合,然后將這些數據集合打包發射
Observable.just(1, 2, 3, 4, 5) .buffer(3, 1) //count:表示從當前指針位置開始打包3個數據項到集合中,skip:表示指針向后移1位, .subscribe(new Action1<List<Integer>>() { @Override public void call(List<Integer> integers) { Log.d("debug", "skip" + integers.toString()); //打印[1, 2, 3],[2, 3, 4],[3, 4, 5],[4, 5],[5] } }); Observable.just(1, 2, 3, 4, 5) .buffer(3) //每3個打包成一個集合,內部就是.buffer(3,3) .subscribe(new Action1<List<Integer>>() { @Override public void call(List<Integer> integers) { Log.d("debug", integers.toString()); //打印[1, 2, 3],[4, 5] } }); Observable.interval(0, 100, TimeUnit.MILLISECONDS) .take(5) .buffer(250, TimeUnit.MILLISECONDS, 2) //將每250毫秒內發射的數據收集到多個集合中,每個集合最多存放2個數據 .subscribe(new Action1<List<Long>>() { @Override public void call(List<Long> longs) { //打印[0, 1],[2],[3, 4],[] Log.d("debug", "count:" + longs.toString()); } }); Observable.interval(0, 100, TimeUnit.MILLISECONDS) .take(5) .buffer(250, TimeUnit.MILLISECONDS) //將每250毫秒內發射的數據收集到一個集合中,集合不限制大小 .subscribe(new Action1<List<Long>>() { @Override public void call(List<Long> longs) { Log.d("debug", longs.toString()); //打印[0, 1, 2],[3, 4] } }); Observable.interval(0, 100, TimeUnit.MILLISECONDS) .take(5) //從指定時間節點開始,將該節點后250毫秒內發射的數據收集的一個集合中,初始節點為0,每發射一次集合, //節點的時間增加150毫秒,即下一次收集數據從150毫秒開始,收集150毫秒到400毫秒之間發射的數據 .buffer(250, 150, TimeUnit.MILLISECONDS) .subscribe(new Action1<List<Long>>() { @Override public void call(List<Long> longs) { Log.d("debug", longs.toString()); //打印[0, 1, 2],[2,3],[4] } });
-
window:定期將來自Observable的數據分拆成一些Observable窗口,然后發射這些窗口,而不是每次發射一項,類似于buffer,buffer發射的是集合,而window發射的是Observable
Observable.just(1, 2, 3, 4, 5) .window(3, 1) .subscribe(new Action1<Observable<Integer>>() { @Override public void call(Observable<Integer> integerObservable) { integerObservable.toList() //將所有數據搜集成一個集合,便于觀察 .subscribe(new Action1<List<Integer>>() { @Override public void call(List<Integer> integers) { Log.d("debug", integers.toString()); //打印[1, 2, 3],[2, 3, 4],[3, 4, 5],[4, 5],[5] } }); } }); Observable.just(1, 2, 3, 4, 5) .window(3) //相當于window(3,3) .subscribe(new Action1<Observable<Integer>>() { @Override public void call(Observable<Integer> integerObservable) { integerObservable.toList() //將所有數據搜集成一個集合,便于觀察 .subscribe(new Action1<List<Integer>>() { @Override public void call(List<Integer> integers) { Log.d("debug", integers.toString()); //打印[1, 2, 3],[4, 5] } }); } }); //剩下其余重載方法也與buffer基本一樣,不重復了