程序员人生 网站导航

RxJava-操作符

栏目:综合技术时间:2016-07-20 09:07:20

基本定义

  • Observable – 被视察者(事件源)
  • Observer – 视察者

Creating Observables(创建操作)

以下展现了创建Observable的各种方法
  • Create — 通过observer的方法创建1个新的Observable
  • Defer — 直到observer定阅的时候才会创建这个Observable,并且为每个observer创建1个Observable
  • Empty/Never/Throw — 创建行动受限特殊的Observable
    Empty — 只会发射onCompleted事件
    Never — 不会发射任事件和数据
    Throw — 只会发射onError
  • From — 将现有的1些对象集或数据结构转换到1个Observable里,然后逐一发射
  • Interval — 返回1个Observable,它按固定的时间间隔发射1个无穷递增的整数序列。
  • Just — 类似from,但just只是单纯的把传入对象发射出去,from会把列表中数据取出来逐一发射
  • Range — 创建1个发射指定范围内的有序整数序列的Observable
  • Repeat — 指定当前Observable可以重复发射
  • Start — 返回1个Observable,它发射1个类似于函数声明的返回值
  • Timer — 创建1个延时发射的Observable

Transforming Observables(变换操作)

以下是可用于对Observable发射的数据履行变换操作的各种操作符
  • Buffer — 可以理解为缓存,定期从Observable中搜集数据放进1个数据包裹,然后把这些数据打包发射,而不是1次发射1个值。
  • FlatMap — 使用1个指定的函数对原始Observable发射的每项数据履行变换操作,这个函数返回1个本身也发射数据的Observable,然后FlatMap合并这些Observables发射的数据,最后将合并后的结果当作它自己的数据序列发射。
  • GroupBy — 将原始Observable按不同的key分组拆分为1些Observables集合,key相同的数据会被同1个Observable发射。
  • Map — 将Observable发射的数据通过1个函数进行变换,然后返回1个发射这些结果的Observable。
  • Scan — 将发射的数据通过1个函数进行变换,然后将变换后的结果作为参数跟下1个发射的数据1起继续通过那个函数变换,这样顺次连续发射得到终究结果
  • Window — 定期将来自原始Observable的数据分解为1个Observable窗口,发射这些窗口,而不是每次发射1项数据,
    Window和Buffer类似,但不是发射来自原始Observable的数据包,它发射的是Observables,这些Observables中的每个都发射原始Observable数据的1个子集,最后发射1个onCompleted通知。

Filtering Observables(过滤操作)

  • Debounce — 仅在过了1段指定的时间还没发射数据时才发射1个数据,Debounce操作符会过滤掉发射速率过快的数据项,意思就是在指定时间内如果发射过量个数据,在最后只会发射最近的哪次数据。
  • Distinct — 过滤掉重复的数据项
  • ElementAt — 只发射第N项数据
  • Filter — 只发射过滤函数返回true的数据项
  • First — 只发射第1项(或满足某个条件的第1项)数据
  • IgnoreElements — 不发射任何数据,只发射Observable的终止通知(onError、onCompleted),当你不关心发射数据,只关心成功与否时可使用该操作符。
  • Last — 只发射最后1项(或满足某个条件的最后1项)数据
  • Sample — 定期发射Observable最近发射的数据项
  • Skip — 过滤Observable发射的前N项数据
  • SkipLast — 过滤Observable发射的后N项数据
  • Take — 只发射Observable发射的前面的N项数据
  • TakeLast — 只发射Observable发射的最后N项数据

Combining Observables(结合操作)

 以下操作符可用于组合多个Observables。
  • And/Then/When — 使用Pattern和Plan作为中介,将两个或多个Observable发射的数据集合并到1起。
    And/Then/When操作符组合的行动类似于zip,但是它们使用1个中间数据结构。接受两个或多个Observable,1次1个将它们的发射物合并到Pattern对象,然后操作那个Pattern对象,变换为1个Plan。随后将这些Plan变换为Observable的发射物。
  • CombineLatest — 当两个Observables中的任何1个发射了数据时,使用1个函数结合每一个Observable发射的最近数据项,并且基于这个函数的结果发射数据,多个同理。
  • Join — 任什么时候候,只要在另外一个Observable发射的数据定义的时间范围内,这个Observable发射了1条数据,就结合两个Observable发射的数据;换句话说,在其中1个Observable发射数据时,只要另外一个Observable发射的数据还没过期(会有2个函数定义各自的有效时间窗口),就结合2个Observable发射的数据。
  • Merge — 可以将多个Observables的输出合并,就好像它们是1个单个的Observable1样。
  • StartWith — 在发射数据最前面添加发射数据项。
  • Switch — 将1个发射多个Observables的Observable转换成另外一个单独的Observable,后者发射最近1个被发射的Observable的发射物,意味着在最近被发射的Observable之前被发射的Observable的发射物都将被抛弃。
    通俗点讲,先前发射Observables中A的发射物,切换后就开始发B的发射物了。。
  • Zip — 通过1个函数合并多个Observable数据发射项,基于这个函数结果为每一个合并项发射单个数据项。

Error Handling Operators(毛病处理)

很多操作符可用于对Observable发射的onError通知做出响应或从毛病中恢复,例如,你可以:

  1. 吞掉这个毛病,切换到1个备用的Observable继续发射数据
  2. 吞掉这个毛病然后发射默许值
  3. 吞掉这个毛病并立即尝试重启这个Observable
  4. 吞掉这个毛病,在1些回退间隔后重启这个Observable

这是操作符列表:

Catch:

  • onErrorResumeNext — 唆使Observable在遇到毛病时发射1个数据序列
  • onErrorReturn — 唆使Observable在遇到毛病时发射1个特定的数据
  • onExceptionResumeNext — instructs an Observable to continue
    emitting items after it encounters an exception (but not another
    variety of throwable)唆使Observable遇到毛病时继续发射数据

Retry:

  • retry — 唆使Observable遇到毛病时重试
  • retryWhen — 唆使Observable遇到毛病时,将毛病传递给另外一个Observable来决定是不是要重新给定阅这个Observable

Observable Utility Operators(辅助操作)

  • Delay — 延迟1段指定的时间再发射来自Observable的发射物
  • Do — 相当于注册1个跟Observable某1个生命周期相干的1个回调方法,比如doOnNext、doOnError等等。
  • Materialize — Materialize将数据项和事件通知都当作数据项封装成Notification对象发射,Dematerialize恰好相反。
  • ObserveOn — 指定1个视察者在哪一个调度器上视察这个Observable,RxJava上调度器就是不同线程。
  • Serialize — 强迫1个Observable连续调用并保证行动正确,保证行动正确是指调用视察者的事件方法顺序正确调用,由于我们的视察方法多是从不同线程异步调用的,便可能会致使行动不正确,使用serialize可以纠正。
  • Subscribe — 操作来自Observable的发射物和通知;
    Subscribe操作符是连接视察者和Observable的胶水。1个视察者要想看到Observable发射的数据项,或想要从Observable获得毛病和完成通知,它首先必须使用这个操作符定阅那个Observable。
    Subscribe操作符的1般实现可能会接受1到3个方法(然后由视察者组合它们),或接受1个实现了包括这3个方法的接口的对象(有时叫做Observer或Subscriber):
    • onNext — 每当Observable发射了1项数据它就会调用这个方法。这个方法的参数是这个Observable发射的数据项。
    • onError — 当Observable没法生成期待的数据或遇到其他问题时会调用此方法,参数是1个Exception或Throwable。
    • onCompleted — 如果没有遇到任何毛病,Observable再最后会调用这个方法。
  • SubscribeOn — 指定Observable本身在哪一个调度器上履行。
  • TimeInterval — 将1个发射数据的Observable转换为发射那些数据发射时间间隔的Observable,即新Observable只发射旧Observable相邻2个发射物之间的发射时间间隔,第1个时间间隔为原始Observable刚开始定阅到发射第1个数据项之间的时间间隔。
  • TimeOut — 指定时长内,如果Observable还没有发射数据,则发送1个毛病通知,多是onError,也多是切换到1个备用Observable,RxJava有几种的实现变体。
  • TimeStamp — 给Observable发射的数据项附加1个时间戳,RxJava中的实现为timestamp,它将1个发射T类型数据的Observable转换为1个发射类型为Timestamped的数据的Observable,每项都包括数据的原始发射时间。
  • Using — 该操作符让你可以唆使Observable创建1个只在它的生命周期内存在的资源,当Observable终止时这个资源会被自动释放。
    using操作符接受3个参数:

    1. 1个用户创建1次性资源的工厂函数
    2. 1个用于创建Observable的工厂函数
    3. 1个用于释放资源的函数

    当1个视察者定阅using返回的Observable时,using将会使用Observable工厂函数创建视察者要视察的Observable,同时使用资源工厂函数创建1个你想要创建的资源。当视察者取消定阅这个Observable时,或当视察者终止时(不管是正常终止还是因毛病而终止),using使用第3个函数释放它创建的资源。

  • To — 将Observable转换为另外一个对象或数据结构。
    该操作符让你可以将Observable或Observable发射的数据序列转换为另外一个对象或数据结构,然后返回1个发射那个对象或数据结构的Observable。

Conditional and Boolean Operators(条件和布尔操作)

以下操作符可用于根据条件发射或变换Observables,或对它们做布尔运算。
  • All — 提供1个函数判断1个Observable的所有发射数据项是不是满足某个条件。
  • Amb — 给定两个或多个Observables,它只发射首先发射数据或通知的那个Observable的所有数据,抛弃其他Observable发射的数据。
  • Contains — 判定1个Observable是不是发射1个特定的值。
  • DefaultIfEmpty — 发射来自原始Observable的值,如果原始Observable没有发射任何值,就发射1个默许值。
  • SequenceEqual — 传递两个Observable给SequenceEqual操作符,它会比较两个Observable的发射物,如果两个序列是相同的(相同的数据,相同的顺序,相同的终止状态),它就发射true,否则发射false。
  • SkipUtil — 抛弃原始Observable发射的数据,直到第2个Observable发射了1项数据。
    SkipUntil定阅原始的Observable,但是疏忽它的发射物,直到第2个Observable发射了1项数据那1刻,它开始发射原始Observable。
  • SkipWhile — 抛弃Observable发射的数据,直到1个指定的条件不成立。
    SkipWhile定阅原始的Observable,但是疏忽它的发射物,直到你指定的某个条件变成false的那1刻,它开始发射原始Observable。
  • TakeUtil — 当第2个Observable发射了1项数据或终止时,抛弃原始Observable后面发射的任何数据。
    TakeUntil定阅并开始发射原始Observable,它还监视你提供的第2个Observable。如果第2个Observable发射了1项数据或发射了1个终止通知,TakeUntil返回的Observable会停止发射原始Observable并终止。
  • TakeWhile — 发射Observable发射的数据,直到1个指定的条件不成立。
    TakeWhile发射原始Observable,直到你指定的某个条件不成立的那1刻,它停止发射原始Observable,并终止自己的Observable。

Mathematical and Aggregate Operators(算术和聚合操作)

下面的操作符用于对全部序列履行算法操作或其它操作,由于这些操作必须等待数据发射完成(通常也必须缓存这些数据),它们对非常长或无穷的序列来讲是危险的,不推荐使用。
  • Average — 计算原始Observable发射数字的平均值并发射它。
  • Concat — 不交错的发射两个或多个Observable的发射物,即Observable是1个1个履行发射的,第1个发射终了第2个Observable才会开始发射。
  • Count — 计算原始Observable发射物的数量,然后只发射这个值。
  • Max — 发射原始Observable的最大值。
  • Min — 发射原始Observable的最小值。
  • Reduce — 按顺序对Observable发射的每项数据利用1个函数并发射终究的值。
  • Sum — 计算Observable发射的数值的和并发射这个和。

Connectable Observable Operators(连接操作)

  • Publish — 将普通的Observable转换为可连接的Observable。
    可连接的Observable (connectable Observable)与普通的Observable差不多,不过它其实不会在被定阅时开始发射数据,而是直到使用了Connect操作符时才会开始。用这个方法,你可以等待所有的视察者都定阅了Observable以后再开始发射数据。
  • Connect — 让1个可连接的Observable开始发射数据给定阅者。
    RxJava中connect是ConnectableObservable接口的1个方法。
  • RefCount — 让1个可连接的Observable行动像普通的Observable。
    RefCount操作符把从1个可连接的Observable连接和断开的进程自动化了。它操作1个可连接的Observable,返回1个普通的Observable。当第1个定阅者定阅这个Observable时,RefCount连接到下层的可连接Observable。RefCount跟踪有多少个视察者定阅它,直到最后1个视察者完成才断开与下层可连接Observable的连接。
  • Replay — 保证所有的视察者收到相同的数据序列,即便它们在Observable开始发射数据以后才定阅。

经常使用的操作符基本都在上面了,固然还有海量的操作符需要平时用到的时候去积累了~

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐