1. 程式人生 > >RxJava2複習筆記三、操作符Zip

RxJava2複習筆記三、操作符Zip

zip專用於合併事件,該合併不是連線(連線操作符後面會說),而是兩兩配對。它按照嚴格的順序應用這個函式。因此它只發射與發射資料項最少的那個Observable物件一樣多的資料。

這裡用簡書大神Season_zlc的一張圖片來形象的解釋這個合併和傳送過程。 這裡寫圖片描述

通過分解動作我們可以看出:

1、組合的過程是分別從兩根水管裡嚴格按照事件的傳送順序各取出一個事件來進行組合, 並且每一個事件只會被使用一次,也就是說不會出現圓形1事件和三角形B事件進行合併,也不可能出現圓形2和三角形A進行合併的情況.

2、最終下游收到的事件數量是和上游中傳送事件最少的那一根水管的事件數量相同. 這個也很好理解, 因為是從每一根水管 裡取一個事件來進行合併, 最少的 那個肯定就最先取完 , 這個時候其他的水管儘管還有事件 , 但是已經沒有足夠的事件來組合了, 因此下游就不會收到剩餘的事件了。

看完文字解釋,我們來看看程式碼該怎麼寫:

 Observable observe01 = Observable.create(new ObservableOnSubscribe<String>() {
    @Override
    public void subscribe(ObservableEmitter<String> e) throws Exception {
        e.onNext("one");
        e.onNext("two");
        e.onNext("three");
        e.onNext("four");
        e.onNext("five");
        e.onComplete();
    }
})
.observeOn(Schedulers.newThread());

Observable observe02 = Observable.create(new ObservableOnSubscribe<Integer>() {
    @Override
    public void subscribe(ObservableEmitter<Integer> e) throws Exception {
        e.onNext(1);
        e.onNext(2);
        e.onNext(3);
        e.onNext(4);
        e.onNext(5);
        e.onComplete();
    }
})
.observeOn(Schedulers.newThread());

Observable.zip(observe01, observe02, new BiFunction<String, Integer, String>() {
   @Override
   public String apply(String s, Integer integer) throws Exception {
       return s + "←----→" + integer;
   }
   }).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer() {
       @Override
       public void onSubscribe(Disposable d) {
           logTag("onSubscribe");
       }

       @Override
       public void onNext(Object value) {
           logTag("onNext :  " + value);
       }

       @Override
       public void onError(Throwable e) {
           logTag("onError");
       }

       @Override
       public void onComplete() {
           logTag("onComplete");
       }
   });

執行結果如下:

logTag: string===onSubscribe
logTag: string===one
logTag: string===two
logTag: string===three
logTag: string===four
logTag: string===
logTag: string===1
logTag: string===2
logTag: string===3
logTag: string===4
logTag: string===5
logTag: string===onNext :  one←----→1
logTag: string===onNext :  two←----→2
logTag: string===onNext :  three←----→3
logTag: string===onNext :  four←----→4
logTag: string===onNext :  five←----→5
logTag: string===onComplete