Rxjava合併型操作符 : 二個或以上的被觀察者進行合併
startWith
concatWith
跟startWith相反
concat
merge
合併操作符,跟concat一樣,但是他跟concat不同的是他是並列的
zip
startWith
//Observable(被觀察者1).startWith(Observable(被觀察者2)) 他們先執行被觀察者2裏發射的事件再執行被觀察者1裏發射的事件
Disposable subscribe = Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> e) throws Exception {
e.onNext(10001);
e.onNext(10002);
e.onNext(10003);
}
}).startWith(Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> e) throws Exception {
e.onNext(20001);
e.onNext(20002);
e.onNext(20003);
}
})).subscribe(new Consumer<Integer>() {
@Override
public void accept(Integer integer) throws Exception {
Log.e(TAG, "accept " + integer);
}
});
concat
//最多可以存4個
Disposable subscribe = Observable.concat(
Observable.just("1"),
Observable.just("2"),
Observable.just("3"),
Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> e) throws Exception {
e.onNext("4");
e.onComplete();
}
})).subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
Log.e(TAG, "accept " + s);
}
});
上面代碼 會按順序輸出 1 2 3 4
merge
//start : 開始累計; count: 累計多少個數量; initialDelay: 開始等待的時間; period :每隔多久執行;
Observable observable1 = Observable.intervalRange(1, 4, 1, 2, TimeUnit.SECONDS);// 1 2 3 4
Observable observable2 = Observable.intervalRange(6, 5, 1, 2, TimeUnit.SECONDS);//6 7 8 9 10
Observable observable3 = Observable.intervalRange(11, 6, 1, 2, TimeUnit.SECONDS);//11 12 13 14 15 16
Observable.merge(observable1,observable2,observable3)
.subscribe(new Consumer() {
@Override
public void accept(Object o) throws Exception {
Log.e(TAG, "accept " + o.toString());
}
});
上面將三個定時發射事件的觀察者合併成了一個,他是接收是並列的.同時執行一樣
zip
//課程觀察者
Observable<String> observable1 = Observable.create(new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> e) throws Exception {
e.onNext("歷史");
e.onNext("物理");
e.onNext("地理");
e.onNext("英語");
e.onComplete();
}
});
//分數觀察者
Observable<Integer> observable2 = Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(ObservableEmitter<Integer> e) throws Exception {
e.onNext(91);
e.onNext(82);
e.onNext(93);
e.onComplete();
}
});
Disposable subscribe = Observable.zip(observable1, observable2, new BiFunction<String, Integer, Object>() {
@Override
public StringBuffer apply(String s, Integer integer) throws Exception {
return new StringBuffer().append("課程:").append(s).append("=").append(integer).append("分");
}
}).subscribe(new Consumer<Object>() {
@Override
public void accept(Object o) throws Exception {
Log.e(TAG, "最終考試的結果是" + o.toString());
}
});
對應的數據是一一對應的.如果一個多了那麼不對應的就不會執行.