RxJava 使用:操作符詳解

本文介紹 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,一對多
  • 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
  • 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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章