RxJava-操作符

基本定义

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

Creating Observables(创建操作)

以下展示了创建Observable的各种方法
  • Create — 通过observer的方法创建一个新的Observable
  • Defer — 直到observer订阅的时候才会创建这个Observable,并且为每一个observer创建一个Observable
  • Empty/Never/Throw — 创建行为受限特殊的Observable

    Empty — 只会发射onCompleted事件

    Never — 不会发射任事件和数据

    Throw — 只会发射onError

  • From — 将现有的一些对象集或数据结构转换到一个Observable里,然后逐个发射
  • Interval — 返回一个Observable,它按固定的时间间隔发射一个无限递增的整数序列。
  • Just — 类似from,但just只是单纯的把传入对象发射出去,from会把列表中数据取出来逐个发射
  • Range — 创建一个发射指定范围内的有序整数序列的Observable
  • Repeat — 指定当前Observable可以重复发射
  • Start — 返回一个Observable,它发射一个类似于函数声明的返回值
  • Timer — 创建一个延时发射的Observable

Transforming Observables(变换操作)

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

    Window和Buffer类似,但不是发射来自原始Observable的数据包,它发射的是Observables,这些Observables中的每一个都发射原始Observable数据的一个子集,最后发射一个onCompleted通知。

Filtering Observables(过滤操作)

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

Combining Observables(结合操作)

 以下操作符可用于组合多个Observables。
  • And/Then/When — 使用Pattern和Plan作为中介,将两个或多个Observable发射的数据集合并到一起。

    And/Then/When操作符组合的行为类似于zip,但是它们使用一个中间数据结构。接受两个或多个Observable,一次一个将它们的发射物合并到Pattern对象,然后操作那个Pattern对象,变换为一个Plan。随后将这些Plan变换为Observable的发射物。

  • CombineLatest — 当两个Observables中的任何一个发射了数据时,使用一个函数结合每个Observable发射的最近数据项,并且基于这个函数的结果发射数据,多个同理。
  • Join — 任何时候,只要在另一个Observable发射的数据定义的时间范围内,这个Observable发射了一条数据,就结合两个Observable发射的数据;换句话说,在其中一个Observable发射数据时,只要另一个Observable发射的数据还没过期(会有2个函数定义各自的有效时间窗口),就结合2个Observable发射的数据。
  • Merge — 可以将多个Observables的输出合并,就好像它们是一个单个的Observable一样。
  • StartWith — 在发射数据最前面添加发射数据项。
  • Switch — 将一个发射多个Observables的Observable转换成另一个单独的Observable,后者发射最近一个被发射的Observable的发射物,意味着在最近被发射的Observable之前被发射的Observable的发射物都将被丢弃。

    通俗点讲,先前发射Observables中A的发射物,切换后就开始发B的发射物了。。

  • Zip — 通过一个函数合并多个Observable数据发射项,基于这个函数结果为每个合并项发射单个数据项。

Error Handling Operators(错误处理)

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

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

这是操作符列表:

Catch:

  • onErrorResumeNext — 指示Observable在遇到错误时发射一个数据序列
  • onErrorReturn — 指示Observable在遇到错误时发射一个特定的数据
  • 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 — 延迟一段指定的时间再发射来自Observable的发射物
  • Do — 相当于注册一个跟Observable某一个生命周期相关的一个回调方法,比如doOnNext、doOnError等等。
  • Materialize — Materialize将数据项和事件通知都当做数据项封装成Notification对象发射,Dematerialize刚好相反。
  • ObserveOn — 指定一个观察者在哪个调度器上观察这个Observable,RxJava上调度器就是不同线程。
  • Serialize — 强制一个Observable连续调用并保证行为正确,保证行为正确是指调用观察者的事件方法顺序正确调用,因为我们的观察方法可能是从不同线程异步调用的,就可能会导致行为不正确,使用serialize可以纠正。
  • Subscribe — 操作来自Observable的发射物和通知;

    Subscribe操作符是连接观察者和Observable的胶水。一个观察者要想看到Observable发射的数据项,或者想要从Observable获取错误和完成通知,它首先必须使用这个操作符订阅那个Observable。

    Subscribe操作符的一般实现可能会接受一到三个方法(然后由观察者组合它们),或者接受一个实现了包含这三个方法的接口的对象(有时叫做Observer或Subscriber):

    • onNext — 每当Observable发射了一项数据它就会调用这个方法。这个方法的参数是这个Observable发射的数据项。
    • onError — 当Observable无法生成期待的数据或遇到其他问题时会调用此方法,参数是一个Exception或Throwable。
    • onCompleted — 如果没有遇到任何错误,Observable再最后会调用这个方法。
  • SubscribeOn — 指定Observable自身在哪个调度器上执行。
  • TimeInterval — 将一个发射数据的Observable转换为发射那些数据发射时间间隔的Observable,即新Observable只发射旧Observable相邻2个发射物之间的发射时间间隔,第一个时间间隔为原始Observable刚开始订阅到发射第一个数据项之间的时间间隔。
  • TimeOut — 指定时长内,如果Observable还没有发射数据,则发送一个错误通知,可能是onError,也可能是切换到一个备用Observable,RxJava有几种的实现变体。
  • TimeStamp — 给Observable发射的数据项附加一个时间戳,RxJava中的实现为timestamp,它将一个发射T类型数据的Observable转换为一个发射类型为Timestamped的数据的Observable,每一项都包含数据的原始发射时间。
  • Using — 该操作符让你可以指示Observable创建一个只在它的生命周期内存在的资源,当Observable终止时这个资源会被自动释放。

    using操作符接受三个参数:

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

    当一个观察者订阅using返回的Observable时,using将会使用Observable工厂函数创建观察者要观察的Observable,同时使用资源工厂函数创建一个你想要创建的资源。当观察者取消订阅这个Observable时,或者当观察者终止时(无论是正常终止还是因错误而终止),using使用第三个函数释放它创建的资源。

  • To — 将Observable转换为另一个对象或数据结构。

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

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

以下操作符可用于根据条件发射或变换Observables,或者对它们做布尔运算。
  • All — 提供一个函数判断一个Observable的所有发射数据项是否满足某个条件。
  • Amb — 给定两个或多个Observables,它只发射首先发射数据或通知的那个Observable的所有数据,丢弃其他Observable发射的数据。
  • Contains — 判定一个Observable是否发射一个特定的值。
  • DefaultIfEmpty — 发射来自原始Observable的值,如果原始Observable没有发射任何值,就发射一个默认值。
  • SequenceEqual — 传递两个Observable给SequenceEqual操作符,它会比较两个Observable的发射物,如果两个序列是相同的(相同的数据,相同的顺序,相同的终止状态),它就发射true,否则发射false。
  • SkipUtil — 丢弃原始Observable发射的数据,直到第二个Observable发射了一项数据。

    SkipUntil订阅原始的Observable,但是忽略它的发射物,直到第二个Observable发射了一项数据那一刻,它开始发射原始Observable。

  • SkipWhile — 丢弃Observable发射的数据,直到一个指定的条件不成立。

    SkipWhile订阅原始的Observable,但是忽略它的发射物,直到你指定的某个条件变为false的那一刻,它开始发射原始Observable。

  • TakeUtil — 当第二个Observable发射了一项数据或者终止时,丢弃原始Observable后面发射的任何数据。

    TakeUntil订阅并开始发射原始Observable,它还监视你提供的第二个Observable。如果第二个Observable发射了一项数据或者发射了一个终止通知,TakeUntil返回的Observable会停止发射原始Observable并终止。

  • TakeWhile — 发射Observable发射的数据,直到一个指定的条件不成立。

    TakeWhile发射原始Observable,直到你指定的某个条件不成立的那一刻,它停止发射原始Observable,并终止自己的Observable。

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

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

Connectable Observable Operators(连接操作)

  • Publish — 将普通的Observable转换为可连接的Observable。

    可连接的Observable (connectable Observable)与普通的Observable差不多,不过它并不会在被订阅时开始发射数据,而是直到使用了Connect操作符时才会开始。用这个方法,你可以等待所有的观察者都订阅了Observable之后再开始发射数据。

  • Connect — 让一个可连接的Observable开始发射数据给订阅者。

    RxJava中connect是ConnectableObservable接口的一个方法。

  • RefCount — 让一个可连接的Observable行为像普通的Observable。

    RefCount操作符把从一个可连接的Observable连接和断开的过程自动化了。它操作一个可连接的Observable,返回一个普通的Observable。当第一个订阅者订阅这个Observable时,RefCount连接到下层的可连接Observable。RefCount跟踪有多少个观察者订阅它,直到最后一个观察者完成才断开与下层可连接Observable的连接。

  • Replay — 保证所有的观察者收到相同的数据序列,即使它们在Observable开始发射数据之后才订阅。

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

时间: 2024-10-10 22:30:45

RxJava-操作符的相关文章

RxJava操作符总结之过滤

RxJava操作符总结之过滤 jsut() just(T t1, T t2, T t3 ....) ,just能够传入多个同样类型的參数,并将当前參数一个接着一个的发送. Observable.just("1","2","3") .subscribe(new Action1<String>() { @Override public void call(String s) { System.out.println(s); } }); 1

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

RxJava系列教程: 1. RxJava使用介绍 [视频教程] 2. RxJava操作符 ? Creating Observables(Observable的创建操作符) [视频教程] ? Transforming Observables(Observable的转换操作符) [视频教程] ? Filtering Observables(Observable的过滤操作符) [视频教程] ? Combining Observables(Observable的组合操作符) [视频教程] ? Erro

RxJava操作符(03-变换操作)

转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51649975 本文出自:[openXu的博客] 目录: Buffer FlatMap flatMapIterable concatMap switchMap GroupBy Map cast Scan Window 源码下载 ??变换操作符的作用是对Observable发射的数据按照一定规则做一些变换操作,然后将变换后的数据发射出去,接下来看看RxJava中主要有哪些变换操作符: 1. B

RxJava操作符 -创建型

操作符类型 创建操作 变换操作 过滤操作 组合操作 错误处理 辅助操作 条件和布尔操作 算术和聚合操作 连接操作 转换操作 创建操作 create 你可以使用create操作符从头开始创建一个Observable,给这个操作符传递一个接受观察者作为参数的函数,编写这个函数让它的行为表现为一个Observable–恰当的调用观察者的onNext,onError和onCompleted方法. 一个形式正确的有限Observable必须尝试调用观察者的onCompleted正好一次或者它的onErro

Android RxJava操作符一览

前言 把现在接触到的操作符全部整理进来,方便查阅,遇到新的也会添加进来.和RxJavaLearn 的README.md同步更新. 操作符决策树 直接创建一个Observable(创建操作) 组合多个Observable(组合操作) 对Observable发射的数据执行变换操作(变换操作) 从Observable发射的数据中取特定的值(过滤操作) 转发Observable的部分值(条件/布尔/过滤操作) 对Observable发射的数据序列求值(算术/聚合操作) 创建操作 用于创建Observab

RxJava操作符(二) __变换操作

RxJava变换操作符 这周真心比较累,一直都在加班,今天才有点自己的时间来学习新的内容,外包工作苦啊! 上周学习了各种创建操作符,像create,from,Just,Defer-.等等,这周中也工作中也用了不少,有时间也需要总结一下自己在工作中使用的操作符.好了,现在来开始学习一个变换操作符吧,不知道什么意思没关系,一个一个去试错吧. map 官方的翻译是对于Observable发射的每一项数据,都会应用一个函数,执行变换操作,然后返回一个发射这些结果的Observable. 还是举个例子吧,

RxJava操作符(05-结合操作)

转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51656736 本文出自:[openXu的博客] 目录: CombineLatest Join Merge StartWith Switch Zip 源码下载 结合操作就是将多个Observable发射的数据按照一定规则组合后发射出去,接下来看看RxJava中的结合操作符: 1. CombineLatest ??当两个Observables中的任何一个发射数据时,使用一个函数结合每个Obse

RxJava操作符repeatWhen()和retryWhen()

第一次见到.repeatWhen()和.retryWhen()这两个操作符的时候就非常困惑了.不得不说,它们绝对是"最令人困惑弹珠图"的有力角逐者. 然而它们都是非常有用的操作符:允许你有条件的重新订阅已经结束的Observable.我最近研究了它们的工作原理,现在我希望尝试着去解释它们(因为,我也是耗费了一些精力才参透它们). Repeat与Retry的对比 首先,来了解一下.repeat()和.retry()之间最直观的区别是什么?这个问题并不难:区别就在于什么样的终止事件会触发重

RxJava操作符(04-过滤操作)

转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51656494 本文出自:[openXu的博客] 目录: Debounce Distinct ElementAt Filter First Last IgnoreElements SampleThrottleFirst SkipSkipLast TakeTakeLast 源码下载 "过滤操作",顾名思义,就是过滤掉Observable发射的一些数据,不让他发射出去,也就是忽略丢弃掉

RxJava操作符(02-创建操作)

转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51645348 本文出自:[openXu的博客] 目录: Create Defer EmptyNeverThrow From Interval Just Range Repeat Timer 源码下载 ??在上一篇博客中我们初步体验了Rxjava的使用,领略了RxJava对于异步操作流编码的简洁风格,接下来的一系列博客,我们主要学习RxJava中的操作符,也就是RxJava的一些API,由于