join
任何時候,只要在另一個Observable發射的數據定義的時間窗口內,這個Observable發射了一條數據,就結合兩個Observable發射的數據
join表示形式:
join( ObservableSource<? extends TRight> other,
Function<? super T, ? extends ObservableSource> leftEnd,
Function<? super TRight, ? extends ObservableSource> rightEnd,
BiFunction<? super T, ? super TRight, ? extends R> resultSelector
)
join有四個參數分別表示:
other:需要組合的right Observable;
leftEnd:接收從left Observable發射來的源數據,並返回一個Observable,這個Observable的生命週期決定了left Obsrvable發射出來的數據的有效期;
rightEnd:接收right Observable發射來的數據,並返回一個Observable,這個Observable的生命週期決定了right Obsrvable發射出來的數據的有效期;
resultSelector:接收從left Observable和right Observable發射出來的數據,並將這兩個數據組合;
join操作兩個Observable ,但不能等價看待,join的效果類似於排列組合,
left Observable 作爲基座窗口,根據自己的節奏不斷髮射數據元素,
right Observable,每發射一個數據,我們都把它和left Observable中已經發射的數據進行一對一匹配;
Observable.just("a", "b")
.join(Observable.create(emitter -> {
for (int i = 0; i < 4; i++) {
System.out.println("onNext:----" + i);
emitter.onNext(i);
//Thread.sleep(1000);
}
}),
s -> {
System.out.println("left:----" + s);//a,b
//使Observable延遲3000毫秒執行
return Observable.timer(3000, TimeUnit.MILLISECONDS);
},
integer -> {
//[0,1,2,3]序列
System.out.println("right:---" + integer);
//使Observable延遲2000毫秒執行
return Observable.timer(2000, TimeUnit.MILLISECONDS);
},
//結合上面發射的數據
(s, integer) -> s + integer
).subscribe(o -> System.out.println("join===========" + o));