Java
RxJava

[RxJava] [1,1,2,2,3,3,1,1] を [[1,1], [2,2], [3,3], [1,1]] のようにグルーピングする

More than 1 year has passed since last update.

あらまし

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にしている。

参考

http://stackoverflow.com/questions/31314345/rxjava-buffer-wind