在內部,每一個Rx operator都作3件事:ios
compose運算符使用一種方法,使一個可觀察的方法脫離另外一個方法。這樣作能夠省去手動執行上述3個步驟的麻煩:中間訂閱和推送隱含在Rx鏈中。這假設您可使用現有運算符進行轉換。若是運算符尚不存在,則須要以傳統的Java OOP方式進行處理。這意味着從管道中提取值並在處理時從新推送。執行此操做的Observable.Transformer將包括對源Observable的顯式訂閱和/或顯式建立要返回的新Observable。git
你會發現這一般只是樣板,而且你能夠經過下降級別來避免一些問題。lift operator與compose的不一樣之處在於轉換Subscriber而不是Observable。github
public final <R> Observable<R> lift(Observable.Operator<? extends R,? super T> lift)異步
而且Observable.Operator <R,T>是Func1<Subscriber<? super R>的別名,Subscriber<? super T>>:將Subscriber <R>轉換爲Subscriber <T>的函數。經過直接與訂閱者交易,咱們避免涉及Observable。訂閱和建立Observable類型的樣板將由lift處理。函數
在下一個示例中,咱們將從新實現map,而不使用現有實現或任何其餘現有運算符。測試
Map運算符須要一個將項從T轉換爲R的函數。在咱們的實現中,這是變換器字段。關鍵部分是call方法。咱們收到一個想要接收R類型項的訂閱者<R>。對於該訂閱者,咱們建立一個新Subscriber<T>,它接收類型爲T的項目,將它們轉換爲R類型並將它們推送到Subscriber<R>。lift處理接收Subscriber <R>的樣板,以及使用建立的Subscriber <T>訂閱源observable。日誌
使用Observable.Operator就像使用Observable.Transformer同樣簡單:orm
日誌輸出:blog
Java中的類構造函數不能使用其類型參數。合乎邏輯的最後一步是建立一個能夠爲咱們推斷類型的方法it
並使用這樣的
當手動推送給訂閱者時,就像咱們在實現Observable.Operator時所作的那樣,有幾件事須要考慮:
下節再續!
原文:https://github.com/Froussios/Intro-To-RxJava/blob/master/Part%203%20-%20Taming%20the%20sequence/7.%20Custom%20operators.md#lift
有什麼討論的內容,能夠加我公衆號: