Android函式響應式程式設計——必學的RxJava組合操作符startWith、merge、concat、zip、combineLastest
1.startWith:給你被觀察者的資料流前再增加一點同類型的資料,這裡增加的是1,2
rx.Observable.just(3, 4, 5).startWith(1, 2) .subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.i("xbh", integer + ""); } });
輸出
12-09 07:17:18.439 18450-18450/com.hdu.a15058124.homework3 I/xbh: 1
12-09 07:17:18.439 18450-18450/com.hdu.a15058124.homework3 I/xbh: 2
12-09 07:17:18.439 18450-18450/com.hdu.a15058124.homework3 I/xbh: 3
12-09 07:17:18.439 18450-18450/com.hdu.a15058124.homework3 I/xbh: 4
12-09 07:17:18.439 18450-18450/com.hdu.a15058124.homework3 I/xbh: 5
2.merge:把多個被觀察者合併到一個被觀察者身上一起輸出,但是可能會讓合併的被觀察者發射的資料交錯。
rx.Observable<Integer> obs1 = rx.Observable.just(1,2,3).subscribeOn(Schedulers.io()); rx.Observable<Integer> obs2 = rx.Observable.just(4,5,6); rx.Observable.merge(obs1,obs2).subscribe(new Action1<Integer>() { @Override public voidcall(Integer integer) { Log.i("xbh", integer + ""); } });
輸出
12-09 07:18:35.919 19718-19718/? I/xbh: 4
12-09 07:18:35.919 19718-19718/? I/xbh: 5
12-09 07:18:35.919 19718-19718/? I/xbh: 6
12-09 07:18:35.921 19718-19758/? I/xbh: 1
12-09 07:18:35.921 19718-19758/? I/xbh: 2
12-09 07:18:35.921 19718-19758/? I/xbh: 3
3.concat:也是合併資料,但是嚴格按照順序發射,一個被觀察者資料傳送完前不會發送後一個被觀察者的資料。
rx.Observable<Integer> obs1 = rx.Observable.just(1,2,3).subscribeOn(Schedulers.io()); rx.Observable<Integer> obs2 = rx.Observable.just(4,5,6); rx.Observable.concat(obs1,obs2).subscribe(new Action1<Integer>() { @Override public void call(Integer integer) { Log.i("xbh", integer + ""); } });
12-09 07:22:43.374 23503-23554/com.hdu.a15058124.homework3 I/xbh: 1
12-09 07:22:43.374 23503-23554/com.hdu.a15058124.homework3 I/xbh: 2
12-09 07:22:43.374 23503-23554/com.hdu.a15058124.homework3 I/xbh: 3
12-09 07:22:43.374 23503-23554/com.hdu.a15058124.homework3 I/xbh: 4
12-09 07:22:43.374 23503-23554/com.hdu.a15058124.homework3 I/xbh: 5
12-09 07:22:43.374 23503-23554/com.hdu.a15058124.homework3 I/xbh: 6
4.zip合併多個被觀察者發出的資料項,但是如果一個被觀察者的資料更多,多出來的那部分不會被髮送。
rx.Observable<Integer> obs1 = rx.Observable.just(1,2,3,4,5); rx.Observable<String> obs2 = rx.Observable.just("a","b","c"); rx.Observable.zip(obs1,obs2,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.i("xbh", s); } });
輸出:
12-09 07:28:28.115 28857-28857/com.hdu.a15058124.homework3 I/xbh: 1a
12-09 07:28:28.115 28857-28857/com.hdu.a15058124.homework3 I/xbh: 2b
12-09 07:28:28.115 28857-28857/com.hdu.a15058124.homework3 I/xbh: 3c
5.combineLatest:把第一個被觀察者最新的資料,和另外的觀察者相連。
rx.Observable<Integer> obs1 = rx.Observable.just(1,2,3,4,5,6,7,8,9); rx.Observable<String> obs2 = rx.Observable.just("a","b","b"); rx.Observable.combineLatest(obs1,obs2,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.i("xbh", s); } });
輸出:
12-09 07:29:14.421 29655-29655/? I/xbh: 9a
12-09 07:29:14.421 29655-29655/? I/xbh: 9b
12-09 07:29:14.421 29655-29655/? I/xbh: 9b