到目前爲止,咱們已經看到了一些運算符,它們以某種方式將多個序列壓扁爲同一類型。接下來的運算符將源序列並排放置,並使用這些值來建立複合值。java
zip是函數式編程中的一個很是基本的函數。它須要兩個或多個序列,並按索引將它們的值一對一地匹配起來。須要一個函數來組合這些值。與您對其餘環境的指望不一樣,在RxJavazip中,默認狀況下不會將全部值組合在一個元組中。ios
在下一個示例中,咱們有兩個源,它們以不一樣的速率發出項。git
日誌輸出:github
若是我把right改爲300毫秒,能夠看到另外一半默默地等待編程
如咱們所見,zip基於索引匹配值。函數式編程
zip有多個重載,用於將兩個以上的序列壓縮在一塊兒。
函數
當壓縮兩個以上的序列時,運算符將等待全部源發出下一個值,而後再發出下一個壓縮值。在下一個示例中,咱們再次添加具備本身頻率的另外一個源。spa
日誌輸出:3d
壓縮序列在任何源序列成功終止時終止。其餘序列的進一步值將被忽略。咱們能夠在下一個示例中看到這一點,其中咱們壓縮了不一樣大小的序列,並計算了壓縮序列中的元素。日誌
日誌輸出:
壓縮序列包含的元素與最短的源序列同樣多。
另外還有zipWith操做符,這是zip序列的另外一種樣式。zipWith容許您在一個鏈中壓縮,但它可能不方便壓縮兩個以上的序列。
日誌輸出:
zipWith還具備一個重載,容許您將可觀察到sequence壓縮爲一個可迭代的序列。
日誌輸出:
在zip使用索引的地方,cominelatest將使用時間。每當一個被組合的觀測值發出一個值時,該值與另外一個可觀察到的最新值組合在一塊兒。一樣,須要一個函數來組合這些值。
日誌輸出:
如咱們所見,CompineLateest首先它等待每一個序列都有一個值。在此以後,由任何一個可觀察到的值發出的每個值都會致使一個組合值被釋放。
就像咱們在本章中看到的每一個Combinator同樣,存在容許組合兩個以上序列的重載。
喜歡把Comoninelatest看做是一個事件發生在另外一個事件的上下文中,當使用來自GUI的輸入(多個有狀態GUI控件影響相同的輸出)時,Comoninelatest很是有用。想象一下,一個文本輸入字段,一個與文本相呼應的段落,以及一個標記是否大寫的複選框。每當文本字段或複選框更改時,cominelatest都會將文本與是否將其大寫的決定結合起來。最終結果已準備好寫入輸出。
下次繼續!!!
原文連接:
https://github.com/Froussios/Intro-To-RxJava/blob/master/Part%203%20-%20Taming%20the%20sequence/4.%20Combining%20sequences.md
代碼:https://github.com/woshiyexinjie/rxjava-leaner
有什麼討論的內容,能夠加我公衆號: