LoginSignup
5
5

More than 5 years have passed since last update.

ReactiveExtensionsでpreviousメッセージを一緒に取得する

Last updated at Posted at 2015-12-26

この記事について

xxがどれだけ増えたとか差分を取得したい時など、streamの前後の変化を使って何かしたい時って無いでしょうか?

この記事は、そんな時のCodeTipです。
コードサンプルはKotlin x RxJavaで説明します。

bufferを使うと良いよ

bufferは、特定の条件(emit数/タイムアウト/他streamのemit)で区切ってstreamのメッセージを配列にまとめてくれます。

また、emit数の場合、skipも一緒に指定でき、コレのdefaultはemit数と同じ値です。例えばskip=1にすると、bufferをメッセージが1件通過する毎に下流へemitします。

この、emit数とskipを指定した場合のbufferを利用することで、1つ前のメッセージも同時に取得出来ます。

それでは、実際のCodeTipです。

Observable.just(1, 2, 3, 4)
        .startWith(0)
        .buffer(2, 1)  // count=2, skip=1
        .subscribe {
            Log.d("yashims85", "List[previous, current]: ${it.toString()}")
        }

bufferは指定した条件(今回の場合は2件)までたまらないと下流に流してくれないので、startWithで初期値を流すようにします。

結果
12-25 15:55:23.209 4654-4654/? D/yashims85: List[previous, current]: [0, 1]
12-25 15:55:23.209 4654-4654/? D/yashims85: List[previous, current]: [1, 2]
12-25 15:55:23.209 4654-4654/? D/yashims85: List[previous, current]: [2, 3]
12-25 15:55:23.209 4654-4654/? D/yashims85: List[previous, current]: [3, 4]
12-25 15:55:23.209 4654-4654/? D/yashims85: List[previous, current]: [4]

completeの時に1件だけで来る場合もあるので、そこの処理だけ注意が必要そうですが、概ね期待通りの結果です。

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5