RxJava操做符lift 笔记<二十五>

在内部,每一个Rx operator都作3件事:ios

  1. 它订阅源并观察值。
  2. 它根据操做员的目的转换观察到的序列。
  3. 它经过调用onNext,onError和onCompleted将修改后的序列推送到本身的订阅者。

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时所作的那样,有几件事须要考虑:

  1. 订阅者能够自由取消订阅。不先检查就不要推送:!subscriber.isUnsubscribed()。
  2. 您有责任遵照Rx协议:任意数量的onNext通知,可选地后跟单个onCompleted或onError。
  3. 若是须要执行异步操做和调度,请使用Rx的调度程序。这将使您的operator变得可测试。

下节再续!

原文:https://github.com/Froussios/Intro-To-RxJava/blob/master/Part%203%20-%20Taming%20the%20sequence/7.%20Custom%20operators.md#lift

有什么讨论的内容,能够加我公众号:

相关文章
相关标签/搜索