在内部,每一个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
有什么讨论的内容,能够加我公众号: