この記事について
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件だけで来る場合もあるので、そこの処理だけ注意が必要そうですが、概ね期待通りの結果です。