RxJava操作符lift笔记25

在内部,每个Rx operator都做3件事:

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

compose运算符使用一种方法,使一个可观察的方法脱离另一个方法。这样做可以省去手动执行上述3个步骤的麻烦:中间订阅和推送隐含在Rx链中。这假设您可以使用现有运算符进行转换。如果运算符尚不存在,则需要以传统的Java OOP方式进行处理。这意味着从管道中提取值并在处理时重新推送。执行此操作的Observable.Transformer将包括对源Observable的显式订阅和/或显式创建要返回的新Observable。

你会发现这通常只是样板,并且你可以通过降低级别来避免一些问题。lift operator与compose的不同之处在于转换Subscriber而不是Observable。

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一样简单:

日志输出:

Java中的类构造函数不能使用其类型参数。合乎逻辑的最后一步是创建一个可以为我们推断类型的方法

并使用这样的

当手动推送给订阅者时,就像我们在实现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

有什么讨论的内容,可以加我公众号:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值