原文:https://github.com/Froussios/Intro-To-RxJava/blob/master/Part 4 - Concurrency/3. Sequences of coincidence.mdjava
join容許您將兩個序列中的項組合在一塊兒。咱們已經看過zip,它根據index對值進行配對。join容許您根據時間配對值。讓咱們先看一下方法簽名:ios
join合併兩個序列,稱爲「left(左)」和「right(右)」。該方法不是靜態(static)的,在方法簽名中,咱們能夠看到兩個名爲leftDurationSelector和rightDurationSelector的方法,它們將相應序列的項做爲參數。它們返回一個定義持續時間(即window)的observable。這些window用於選擇要配對的值。配對的值將傳遞給resultSelector函數,該函數將它們組合成單個值,就像zip中的resultSelector同樣,該值將由join發出。git
這使join變得強大,但也很難理解的是,如何選擇值進行配對。到達序列中的每一個值都會爲本身開一個window。相應的持續時間選擇器決定每一個值的window什麼時候終止。當window打開時,以相反順序到達的任何值都將與它配對。這個過程對於左右序列是對稱的,因此讓咱們考慮一個只有一個序列的項目有window的狀況。github
在第一個示例中,left序列中的窗口從不關閉,而右序列中的window爲0。併發
輸出:ide
當左值的窗口永遠不會結束時,這意味着左序列中的每一個值都將與從右序列後面的每一個值配對。由於這裏右側序列的頻率是左側序列的一半,在兩個右側值之間,左側還有兩個窗口打開。第一個右邊的值與前兩個左邊的值配對,第二個右邊的值與前四個左邊的值配對,第三個右邊的值與第六配對,依此類推。函數
讓咱們改變一下這個例子,看看當每隔100毫秒左右發射而且150毫秒後左窗關閉時會發生什麼。而後會發生的是每一個左窗口保持打開足夠長的時間以捕獲兩個正確的值:一個是同時發出的,另外一個是在100ms後發出的。spa
輸出:blog
兩個序列都有窗口。序列的每一個值都去匹配:ip
一旦檢測到一對,join就會將兩個值傳遞給結果選擇器併發出結果。groupJoin更進了一步。讓咱們從方法簽名開始吧。
簽名與resultSelector與join相似,除了resultSelector,結果(result)選擇器從左側序列中獲取一個項目,從右側序列中獲取一個值的可觀察值。該可觀察量將發出左值與之配對的每一個正確值。groupJoin中的配對是對稱的,就像鏈接同樣。
讓咱們從鏈接中從新審視咱們的例子,左邊的窗口永遠不會關閉。
輸出:
在結果選擇器中,咱們有一個左值和一個可觀察的右值。咱們使用它來打印右側與左側值配對的全部值。若是您回到使用鏈接的示例,您將看到對是相同的,更改如何在resultSelector中提供給咱們。
您可使用groupJoin和flatMap實現join
您還可使用join和groupBy實現groupJoin。這樣作會要求您構造元組(tuples)做爲結果,並在元組的左側部分執行groupBy。
原文:https://github.com/Froussios/Intro-To-RxJava/blob/master/Part 4 - Concurrency/3. Sequences of coincidence.md
git:https://github.com/woshiyexinjie/rxjava-leaner