RxJava 使用:操作符详解

28 篇文章 0 订阅
5 篇文章 0 订阅

本文介绍 RxJava 的操作符含义及使用方法,持续补充中。
具体代码示例可见:https://github.com/Gdeeer/GdTestHub
RxJava 官网:http://reactivex.io/documentation/operators.html

一、创建操作符

  • Just
    • 发布几个指定的产品
  • Range
    • 发布一串连续的整数
  • From
    • 发送一个序列的元素
      • FromArray
      • FromIterable
      • FromFuture
      • FromCallable
  • Create
    • 需要用户手动调用 onNext() 来发布产品
  • Timer
    • 在一段时间后发布一个 0L
  • Inteval
    • 以固定的间隔发布从0开始的一串连续整数(默认在间隔后才开始发布,指定 initialDelay 为 0 则立即开始)
  • IntervalRange
    • 以固定的间隔发布指定头尾的一串连续整数
  • Repeat
    • 把上游的发布过程重复n遍,(有过程后才能重复,即要用在生产出 Observable 后才能使用 Repeat;过程完了之后才能重复)
    • 上游发布 1,2,3,重复2遍就是 1,2,3,1,2,3
  • Defer
    • 发布的产品是 Observable,即被 subscribe 后,才创建真正的 Obserable
  • Empty
    • 不发布产品,直接宣告结束
  • Never
    • 不发布产品,不宣告结束

二、转换操作符

  • Buffer

    • 把上游发布的产品收集后分批发布(一批满了才一起发布)
    • 上游发布 1,2,3,4
    • 2个一批,发布【1,2】,【3,4】
  • Map

    • 把上游的产品转换为另一种产品,一个A转换为一个B,一对一
  • FlatMap

    • 更像是 MapFlat
    • 把上游的产品转换为另一种产品,一个A转换为多个B,一对多
  • SwitchMap

    • 把上游的产品转换为另一种产品
    • 上游每秒生产一个产品,A、B…
    • A 生产后每秒生产一个 A1、A2…
    • B 生产后每秒生产一个 B1、B2…
    • 如果是 flatMap,B 生产后,A1、A2… 的生产不受影响,即同时可以有多个原产品的衍生产品在生产
    • 如果是 switchMap,B 生产后,A1、A2… 的生产就会停止,即同事只有一个原产品的衍生产品在生产
    • 官网的对应图示跟 flatMap 一样,只是要去掉第二个绿色菱形;因为原产品的蓝的已经发布,绿的就失效了
  • GroupBy

    • 把上游的产品按某个标准分组,下游拿到的产品是 Observable,需要再 subscribe 后才能发布(按时间线依次发布)
    • 上游发布 1,2,3,4
    • 按奇偶,由两个 Observable 分别发布 【1,3】,【2,4】
  • Scan

    • 可以对上游的产品进行叠加操作(如累加、累乘),再依次发布出去
    • 上游发布 1,2,3,4
    • 累加发布 1,3,6,10
  • Window

    • 把上游的产品分批,每批由不同的 Observable 发布(按时间线依次发布)
    • 上游发布 1,2,3,4
    • 2个一批,由两个 Observable 分别发布 【1,2】,【3,4】

三、过滤操作符

  • Debounce
    • 收到上游的产品,一段时间内没有收到其他产品,才把这个产品发布出去
    • 上游每隔 1s 发布 1,2,3,4
    • Debounce 2s,则只有 4 被发布到下游
  • Distinct
    • 去重
  • ElementAt
    • 按 index 取值
  • Filter
    • 按某种条件过滤
  • First
    • 第一个
  • IgnoreElements
    • 忽略产品,只发布结束信号
  • Last
    • 最后一个
  • Sample
    • 取样,发布指定间隔内,上游发布的最后一个产品(没有则不发布)
  • Skip
    • 跳过几个产品,或跳过一段时间
  • SkipLast
    • 跳过最后的几个产品,或跳过最后的一段时间(实际上是相当于延迟发布)
  • Take
    • 只取前面的几个
  • TakeLast
    • 只取最后的几个

四、合并操作符

把多个 Observable 合并为一个

  • CombineLast
    • 静态方法
    • 合并多个 Observable,任一 Observable 发布产品时,将这个产品跟其他 Observable 的最新产品一起处理后发布
    • 当所有 Observable 都有产品发布后才开始一起处理、发布
    • 挺绕的,看看官网的图吧
  • Join
    • 合并两个 Observable:left、right,left.join(right),任何一个发布产品时,将这个产品和它所处 window 区间所属的产品合并后发布
    • 每个产品会有一个属于自己的 window
    • 每个产品可能处于多个 window 区间内
    • window 的开启:left、right 中有产品发布,就会开启一个该产品对应的 window
    • window 的关闭:产品对应 window 的关闭由它的 leftEnd、rightEnd 两个 Observable 决定,leftEnd、rightEnd 发布一个产品或宣布结束,就会关闭它的 window
    • 很绕,看看官网的图和demo吧(可用于生成其他的操作符)
  • Merge
    • 静态方法
    • 合并多个 Observable,用一个 Observable 来统一发布它们的产品(不做干预,只是发布)
  • StartWith
    • 在上游发布前先发布几个产品
  • SwitchOnNext
    • 静态方法
    • 处理一个发布子 Observable 的源 Observable,源 Observable 每发布一个新的子 Observable,则开始对外发布这个子 Observable 的产品
    • 同时取消对之前的子 Observable 的订阅
  • Zip
    • 静态方法
    • 合并多个 Observable,全部 Observable 一起推进,全都有产品发布时才开始一起处理,对外发布

五、错误处理操作符

  • Retry
    • onError 之后重新 subscribe n 次

六、Observable 工具操作符

  • Delay
    • 收到上游的产品后,延迟一段时间,才开始发布
  • DoOn…
    • 监听 Observable 的生命周期回调
  • Materialize
    • 把 onNext、onComplete、onError 都包装为 Notification 发布出去
  • DeMaterialize
    • 把 Notification 解包装为 onNext、onComplete、onError
  • ObserveOn
    • 指定 Observer 接收产品的线程
  • SubscribeOn
    • 指定 subscribe 发生的线程,即源 Observable 生产产品的线程
  • TimeInterval
    • 发布一个 Timed 产品,它包装了原产品和该产品距离上一个产品发布的时间间隔
  • Timeout
    • 设置产品的发布间隔,超时后发出 onError
    • 默认在 Computation 线程
  • Timestamp
    • 发布一个 Timed 产品,它包装了原产品和该产品的发布时间
  • Using
    • 静态方法
    • 接受三个方法,一个 Resource 工厂,一个 Observable 工厂,一个 Resource 的 dispose 方法
    • Resource 是 Observable 会用到的资源,和 Observable 的存活时间相同,在 Observable terminate 时会 dispose 这个 Resource
    • 类似一个 try/finally,在 dispose 方法中做回收工作

七、条件和布尔操作符

  • All
    • 是否所有产品都满足某个条件
  • Amb
    • 静态方法
    • 接受一个 Observable 序列,只发布其中最早发送产品或通知的 Observable 的产品
  • Contains
    • 上游的产品中是否包含某个特定产品
  • DefaultIfEmpty
    • 如果上游的 Observable 为空,则发布一个默认产品
  • SequenceEqual
    • 静态方法
    • 判断两个 Observable 发布的产品序列是否相同(一一对应)
  • SkipUtil
    • 跳过上游的产品,直到第二个 Observable 开始发布;随后都正常发布
  • SkipWhile
    • 跳过上游的产品,直到产品不满足某个条件;随后都正常发布
  • TakeUntil
    • 发布上游的产品,直到第二个 Observable 开始发布,或产品满足了某个条件;随后不再发布
  • TakeWhile
    • 发布上游的产品,直到产品不满足某个条件;随后不再发布

八、数学和聚合操作符

需要引入 rxjava2-extensions 库,implementation ‘com.github.akarnokd:rxjava2-extensions:0.20.10’,来自 mavenCentral()。
使用 MathFlowable、MathObsevable

  • Average
    • 静态方法
    • 产品的平均值
  • Concat
    • 依次发布若干个 Observable
  • Count
    • 产品的总数
  • Max
    • 静态方法
    • 产品的最大值
  • Min
    • 静态方法
    • 产品的最小值
  • Reduce
    • 可以对上游的产品进行叠加操作(如累加、累乘),再将最终结果发布出去
    • 与 scan 很类似
    • 上游发布 1,2,3,4
    • 累加发布 10
  • Sum
    • 静态方法
    • 产品的累加值

九、可连接 Observable 操作符

  • Publish
    • 把一个普通 Observable 转换为可连接 Observable
    • 可连接的 Observable:
    • 在 connect 后开始发布
    • 一次 connect 只会发布一次,不管期间有没有 Observer、Observer 在何时 subscribe
    • 一次 connect 后不能再次 connect
    • 一次 disConnect 后可以再次 connect
    • 再次 connect 后会重头开始发布
    • disConnect:
    • 调用 connect 的 dispose,或自然结束
  • Connect
    • 见 Publish
  • RefCount
    • 使一个可连接 Observable 的行为与普通 Observable 一致
    • 在第一个 Observer subscribe 时自动 connect
    • 在最后一个 Observer unSubscribe 时自动 disConnect
  • Replay
    • 把一个普通 Observable 转换为特殊的可连接 Observable
    • connect 后,对每个 Observer 都发送相同的产品序列,如果它 subscribe 得晚的话,把错过的先补给它

十、其他

  • To
    • 转化 Obserable 到其他结构
    • ToList
    • ToSortedList
    • ToMap
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值