1. 程式人生 > >Android函式響應式程式設計——必學的RxJava組合操作符startWith、merge、concat、zip、combineLastest

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 void 
call(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