Rxjava 常用操作符

一、创建操作符

用于创建Observable的操作符。

1、Create

使用一个函数从头开始创建一个Observable。

create 方法默认不在任何特定的调度器上执行。

2、Empty/Never/Throw

Empty 创建一个不发射任何数据但是正常终止的Observable。

Never 创建一个不发射数据也不终止的Observable。

Throw 创建一个不发射数据以一个错误终止的Observable。

3、From

将其它种类的对象和数据类型转换为Observable。

from 默认不在任何特定的调度器上执行。然而你可以将Scheduler作为可选的第二个参数传 递给Observable,它会在那个调度器上管理这个

Future。

•fromFuture():接收一个Future对象,会同步等待Future返回的结果再发送数据,也可以设置等待超时时间。

4、Interval (别名timer)

创建一个按固定时间间隔发射整数序列的Observable。

Interval 操作符返回一个Observable,它按固定的时间间隔发射一个无限递增的整数序列。

interval 默认在 computation 调度器上执行。你也可以传递一个可选的Scheduler参数来指定 调度器。

5、Just

创建一个发射指定值的Observable。

Just将单个数据转换为发射那个数据的Observable。 Just类似于From,但是From会将数组或Iterable的数据取出然后逐个发射,而Just只是简

单的 原样发射,将数组或Iterable当做单个数据。

注意:如果你传递 null 给Just,它会返回一个发射 null 值的Observable。不要误认为它会 返回一个空Observable(完全不发射任何数据的

Observable),如果需要空Observable你应 该使用Empty操作符。

6、Range

创建一个发射特定整数序列的Observable。

Range操作符发射一个范围内的有序整数序列,你可以指定范围的起始和长度。 RxJava将这个操作符实现为 range 函数,它接受两个参数,

一个是范围的起始值,一个是范 围的数据的数目。如果你将第二个参数设为0,将导致Observable不发射任何数据(如果设置 为负数,会抛异

常)。

 range 默认不在任何特定的调度器上执行。有一个变体可以通过可选参数指定Scheduler。

7、Repeat

创建一个发射特定数据重复多次的Observable。

Repeat重复地发射数据。某些实现允许你重复的发射某个数据序列,允许你限制重复的次数。

RxJava将这个操作符实现为 repeat 方法。它不是创建一个Observable,而是重复发射原始 Observable的数据序列,这个序列或者是无限的,

或者通过 repeat(n) 指定重复次数。

repeat 操作符默认在 trampoline 调度器上执行。有一个变体可以通过可选参数指定 Scheduler。

二、变换操作符

1、FlatMap

FlatMap 将一个发射数据的Observable变换为多个Observables,然后将它们发射的数据合并 后放进一个单独的Observable。

FlatMap 操作符使用一个指定的函数对原始Observable发射的每一项数据执行变换操作,这 个函数返回一个本身也发射数据的Observable,然

后 FlatMap 合并这些Observables发射的数 据,最后将合并后的结果当做它自己的数据序列发射。 这个方法是很有用的,例如,当你有一个这

样的Observable:它发射一个数据序列,这些数 据本身包含Observable成员或者可以变换为Observable,因此你可以创建一个新Observable

发射这些次级Observable发射的数据的完整集合。

 注意: FlatMap 对这些Observables发射的数据做的是合并( merge )操作,因此它们可能是交 错的。

在许多语言特定的实现中,还有一个操作符不会让变换后的Observables发射的数据交错,它 按照严格的顺序发射这些数据,这个操作符通常

被叫作 ConcatMap 或者类似的名字。

注意:任何一个通过这个 flatMap 操作产生的单独的Observable调用 onError 异常终止 了,这个Observable自身会立即调用 onError 并终止。

 是

2、concatMap

还有一个 concatMap 操作符,它类似于最简单版本的 flatMap ,但是它按次序连接而不是合 并那些生成的Observables,然后产生自己的数据

序列。

3、Map

对Observable发射的每一项数据应用一个函数,执行变换操作。

Map 操作符对原始Observable发射的每一项数据应用一个你选择的函数,然后返回一个发射 这些结果的Observable。 RxJava将这个操作符实

现为 map 函数。

Map默认不在任何特定的调度器上执行。

4、cast

cast 操作符将原始Observable发射的每一项数据都强制转换为一个指定的类型,然后再发射 数据,它是 map 的一个特殊版本。

三、过滤操作符

1、Distinct

抑制(过滤掉)重复的数据项。

Distinct 的过滤规则是:只允许还没有发射过的数据项通过。 在某些实现中,有一些变体允许你调整判定两个数据不同( distinct )的标准。还有

一些实现 只比较一项数据和它的直接前驱,因此只会从序列中过滤掉连续重复的数据。

2、ElementAt

只发射第N项数据。

ElementAt 操作符获取原始Observable发射的数据序列指定索引位置的数据项,然后当做自 己的唯一数据发射。

RxJava将这个操作符实现为 elementAt ,给它传递一个基于0的索引值,它会发射原始 Observable数据序列对应索引位置的值,如果你传递给

elementAt 的值为5,那么它会发射第 六项的数据。 如果你传递的是一个负数,或者原始Observable的数据项数小于 index+1 ,将会抛出一 个

IndexOutOfBoundsException 异常。

3、Filter

只发射通过了谓词测试的数据项。

Filter 操作符使用你指定的一个谓词函数测试数据项,只有通过测试的数据才会被发射。

filter 默认不在任何特定的调度器上执行。

4、Take

只发射前面的N项数据。

使用 Take 操作符让你可以修改Observable的行为,只返回前面的N项数据,然后发射完成通 知,忽略剩余的数据。

take(int) 默认不任何特定的调度器上执行。

5、TakeLast

发射Observable发射的最后N项数据。

使用 TakeLast 操作符修改原始Observable,你可以只发射Observable'发射的后N项数据,忽 略前面的数据。

使用 takeLast 操作符,你可以只发射原始Observable发射的后N项数据,忽略之前的数据。 注意:这会延迟原始Observable发射的任何数据项,直到它全部完成。 takeLast 的这个变体默认不在任何特定的调度器上执行。

6、takeLastBuffer

还有一个操作符叫 takeLastBuffer ,它和 takeLast 类似,,唯一的不同是它把所有的数据项 收集到一个 List 再发射,而不是依次发射一个。

四、结合操作符

1、Merge

合并多个Observables的发射物。

使用 Merge 操作符你可以将多个Observables的输出合并,就好像它们是一个单个的 Observable一样。

Merge 可能会让合并的Observables发射的数据交错(有一个类似的操作符 Concat 不会让数 据交错,它会按顺序一个接着一个发射多个

Observables的发射物)。

任何一个原始Observable的 onError 通知会被立即传递给观察者,而且 会终止合并后的Observable。

2、Zip

通过一个函数将多个Observables的发射物结合到一起,基于这个函数的结果为每个结合体发 射单个数据项。

Zip 操作符返回一个Obversable,它使用这个函数按顺序结合两个或多个Observables发射 的数据项,然后它发射这个函数返回的结果。它按

照严格的顺序应用这个函数。它只发射与 发射数据项最少的那个Observable一样多的数据。 RxJava将这个操作符实现为 zip 和 zipWith 。

3、StartWith(Concat)

在数据序列的开头插入一条指定的项。

如果你想要一个Observable在发射数据之前先发射一个指定的数据序列,可以使 用 StartWith 操作符。

(如果你想一个Observable发射的数据末尾追加一个数据序列可以使用 Concat 操作符。)

五、辅助操作符

1、doOnNext

doOnNext表示在OnNext之前的操作。

doOnNext 操作符类似于 doOnEach(Action1) ,但是它的Action不是接受一个 Notification 参 数,而是接受发射的数据项。

2、doOnSubscribe

doOnSubscribe表示在OnSubscribe之前的操作。

doOnSubscribe 操作符注册一个动作,当观察者订阅它生成的Observable它就会被调用。

3、doOnUnsubscribe

doOnUnsubscribe表示在OnUnsubscribe之前的操作。

doOnUnsubscribe 操作符注册一个动作,当观察者取消订阅它生成的Observable它就会被调用。

4、doOnCompleted

doOnCompleted表示在OnCompleted之前的操作。

doOnCompleted 操作符注册一个动作,当它产生的Observable正常终止调用 onCompleted 时 会被调用。

5、doOnError

doOnError表示在OnError之前的操作。

doOnError 操作符注册一个动作,当它产生的Observable异常终止调用 onError 时会被调用。

6、doOnTerminate

doOnTerminate 操作符注册一个动作,当它产生的Observable终止之前会被调用,无论是正常还是异常终止。

7、finallyDo

finallyDo 操作符注册一个动作,当它产生的Observable终止之后会被调用,无论是正常还是异常终止。

8、ObserveOn

指定一个观察者在哪个调度器上观察这个Observable。它指示Observable在一个指定的调度器上 给观察者发通知。

9、SubscribeOn

指定Observable自身在哪个调度器上执行。

10、TimeInterval

将一个发射数据的Observable转换为发射那些数据发射时间间隔的Observable。

timeInterval 默认在 immediate 调度器上执行,你可以通过传参数修改。

11、Timeout

如果原始Observable过了指定的一段时长没有发射任何数据, Timeout 操作符会以一 个 onError 通知终止这个Observable。

第一个变体接受一个时长参数,每当原始Observable发射了一项数据, timeout 就启动一个 计时器,如果计时器超过了指定指定的时长而原始Observable没有发射另一项数 据, timeout 就抛出 TimeoutException ,以一个错误通知终止Observable。这个 timeout 默认在 computation 调度器上执行,你可以通过参数指定其它的调度器。

这个版本的 timeout 在超时时会切换到使用一个你指定的备用的Observable,而不是发错误 通知。它也默认在 computation 调度器上执行。

推荐阅读更多精彩内容

  • 一、RxJava操作符概述 RxJava中的操作符就是为了提供函数式的特性,函数式最大的好处就是使得数据处理简洁易...
    无求_95dd阅读 550评论 0 19
  • 一、RxJava操作符概述 RxJava中的操作符就是为了提供函数式的特性,函数式最大的好处就是使得数据处理简洁易...
    爱生活爱Android阅读 141评论 0 1
  • 创建操作 用于创建Observable的操作符Create通过调用观察者的方法从头创建一个ObservableEm...
    rkua阅读 297评论 0 1
  • Rxjava2 可谓是日常开发中的利器,特别是在异步任务中更能发挥作用。响应式编程以及流式api的良好支持,给予了...
    tooyoungt阅读 227评论 0 3
  • 记录RxJava操作符,方便查询(2.2.2版本) 英文文档地址:http://reactivex.io/docu...
    凌云飞鱼阅读 38评论 0 0