RxJava-操作符
来源:程序员人生 发布时间:2016-07-20 09:07:20 阅读次数:2353次
基本定义
- 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
以下是可用于对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个备用的Observable继续发射数据
- 吞掉这个毛病然后发射默许值
- 吞掉这个毛病并立即尝试重启这个Observable
- 吞掉这个毛病,在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个用于创建Observable的工厂函数
- 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开始发射数据以后才定阅。
经常使用的操作符基本都在上面了,固然还有海量的操作符需要平时用到的时候去积累了~
生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠