daisuke_nomura の日記

Android プログラマーな鉄道ファンのブログ

RxJava で重複を削除する

RxJava では、要素の重複を削除することもできます。
コードは RxJava 2 です。

distinct

distinct メソッドを使うと重複要素を削除できます。

Observable
        .just(1, 1, 2, 1)
        .distinct()
        .blockingForEach(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                Log.d("koko", String.valueOf(integer));
            }
        });

出力結果

koko: 1
koko: 2

distinctUntilChanged

distinctUntilChanged メソッドを使うと、次に重複しない要素が出てくるまでの間、重複が削除されます。

Observable
        .just(1, 1, 2, 1, 1, 2, 1, 1)
        .distinctUntilChanged()
        .blockingForEach(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                Log.d("koko", String.valueOf(integer));
            }
        });

出力結果

koko: 1
koko: 2
koko: 1
koko: 2
koko: 1

オブジェクトも可能

対象がオブジェクトでも可能です。
オブジェクトの場合、 distinct に Function を食わせ、その戻り値が一致してるものが削除されます。

class Koko {
    public String str;

    public Koko(String str) {
        this.str = str;
    }
}
List<Koko> kokoList = new ArrayList<>();
kokoList.add(new Koko("aaaa"));
kokoList.add(new Koko("bbbb"));
kokoList.add(new Koko("aaaa"));

Observable
        .fromIterable(kokoList)
        .distinct(new Function<Koko, String>() {
            @Override
            public String apply(Koko koko) throws Exception {
                return koko.str;
            }
        })
        .blockingForEach(new Consumer<Koko>() {
            @Override
            public void accept(Koko koko) throws Exception {
                Log.d("koko", String.valueOf(koko.str));
            }
        });

出力結果

koko: aaaa
koko: bbbb

参考
ReactiveX - Distinct operator