あらまし
RxJavaで入力として取ったデータを一定のルールでグルーピングして受け取りたいケースがあった。
連続しない値はまとめたくないので、toMultiMap()
やgroupBy()
は使えない。
解
こんな感じになった。
題名と違ってtrue
, false
を使っているのはどうか見逃してほしい。
同値の判断は.distinctUntilChanged()
でできるはず。
import rx.Observable;
public class RxJavaPlayground {
public static void main(String[] args) {
Observable.just(false, false, true, true, false, true, true)
.publish(p -> {
return p.buffer(() -> p.distinctUntilChanged());
})
.filter(x -> x.size() > 0)
.subscribe((x) -> System.out.println(x));
/*
* =>
* [false, false]
* [true, true]
* [false]
* [true, true]
*/
}
}
.distinctUntilChanged()
で新しいデータが出る(グルーピングが終わる)タイミングで、
そこまで溜め込んだデータを出す(.buffer()
の機能)ようにしている。
Observable
を.buffer()
と.distinctUntilChanged()
の両方が読むため、.publish()
でHotにしている。