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