RxJavaのObservable生成メソッドを一通り試してみた
RxJavaを使いこなすためにはObservableを理解することが欠かせません。今回はより深くRxJavaを理解するためにObservable生成メソッドの挙動を調べてみました。
RxJava(というかReactivePrograming)については、以前も紹介した以下の記事が大変分かりやすかったです。
主要なObservable生成メソッド
Observableを生成する主要なメソッドの概要を以下の表にまとめました。まだRxJavaを勉強し始めたばかりなので、間違い等あれば指摘していただけるとありがたいです。
Observable生成メソッドはRxJavaの公式サイトを参照してますが、repeatWhen
だけよく理解できず…。引き続き調べます。
Creating Observables · ReactiveX/RxJava Wiki · GitHub
メソッド名 | 概要 |
---|---|
just | 引数をそのままストリームに流す。オブジェクトを渡すとストリームに流れる値はアドレスとなり、nullを渡すとnullが通知される。 |
from | 引数を連続的なメッセージとしてストリームに流す。コレクションを渡すと個々の要素が1つずつストリームに流される。 |
repeat | 自分より前に接続されたObservableの値を引数で指定した回数ストリームに流す。引数を指定しないと無限にストリームに値を流し続ける。インスタンスメソッドなので事前に作成したObservableにつなげる形じゃないと使えない。 |
repeatWhen | よくわからない… |
create | subscriberがストリームの値を検知した時の挙動を自分で細かく設定できる。引数に、subscriberが値を検知した際に実行したい処理を定義したメソッドを渡す。 |
defer | 自身がsubscribeされるまで値を流さないようなストリームを作成する。自身がsubscribeされた時、deferの引数に渡したObservable(を生成するメソッド)の値をストリームに流す。defer以前にストリームに流れた値は含まれない。 |
range | 引数に2つの整数で範囲を指定すると、その範囲の値をストリームに流す。両方0にすると何も送らない。マイナスの値を引数にすると例外が発生する。 |
interval | longとTimeUnitを指定すると、指定した間隔ごとに1ずつインクリメントしながら値をストリームに流す。 |
timer | longとTimeUnitを指定すると、指定した時間経過後にストリームに0が流される。 |
empty | ストリームに何の値も流さない。その結果onNextは実行されないがonCompletedは実行される。 |
error | ストリームに何の値も流さずエラーを発生させる。その結果onErrorのみ実行される。 |
never | ストリームに何の値も流さない。neverではonNext, onError, onCompletedのいずれも実行されない。 |
サンプルコード
上記のメソッドが具体的にどのような挙動になるか確認するためには、Observableを生成する各メソッドの実際に試してみるのが一番です。
ということでサンプルで実際の動きを確認してみました。サンプルはAndroidで動かしていますが、以下では実際の処理部分のみを抜粋しています。
なお以下のサンプルではラムダを使っているので、ラムダが使えない場合はそれぞれ対応するクラスに適宜置き換えてください*1。
*1:というかラムダなかったら辛すぎるのでぜひラムダ使いましょう