3

非常に具体的な方法でオブザーバブルを観察しているとしましょう。

    resultObservable = anotherObservable.filter(~Filter code~).take(15);  

filter と take のような 2 つの定義済み演算子を組み合わせたカスタム 演算子を作成したいと思います。次のように動作するように

    resultObservable = anotherObservable.lift(new FilterAndTake(15));  

また...

    resultObservable = anotherObservable.FilterAndTake(15);  

これまでのところ、これを実行できる非常に特殊な演算子を書くことに満足しています。そして、私はそのオペレーターを持ち上げることができます。

しかし、rx Java に関する現在の限られた知識を考えると、カスタム オペレータで使用する必要があるたびにテイクとフィルタの機能を書き直す必要があります。

これを行うことは問題ありませんが、オープン ソース コミュニティによって維持されている既存のオペレーターを再利用したり、作成したオペレーターをリサイクルしたりしたいと考えています。

また、オペレーターとサブスクライバーに関する十分な知識が不足していることもわかります。

rx-java のドキュメントではないチュートリアルを誰かが推薦できますか?
私がこれを言うのは、ドキュメントは一般的な概念を説明していますが、RX Java のより堅牢なアプリケーションを刺激する例を残さずに、その機能の概念と一般的なコンテキストを分離しているからです。

だから本質的に

カスタムデータフローを代表的な演算子にカプセル化しようとしています。この機能は存在しますか?

4

2 に答える 2

5

Operatorオブジェクトを構成する特別な関数 (または砂糖) については知りません。ただし、単純に新しい Operator を作成して、既存の Operator を構成することができます。FilterAndTakeOperatorの実際の例を次に示します。

public class FilterAndTake<T> implements Observable.Operator<T, T> {

    private OperatorFilter<T> filter;
    private OperatorTake<T> take;

    public FilterAndTake(Func1<? super T, Boolean> predicate, int n) {
        this.filter = new OperatorFilter<T>(predicate);
        this.take = new OperatorTake<T>(n);
    }

    @Override
    public Subscriber<? super T> call(final Subscriber<? super T> child) {
        return filter.call(take.call(child));
    }
}

そして、次のように使用できます。

public static void main(String[] args) {
    Observable<Integer> xs = Observable.range(1, 8);

    Func1<Integer, Boolean> predicate = new Func1<Integer, Boolean>() {
        @Override
        public Boolean call(Integer x) {
            return x % 2 == 0;
        }
    };

    Action1<Integer> action = new Action1<Integer>() {
        @Override
        public void call(Integer x) {
            System.out.println("> " + x);
        }
    };

    xs.lift(new FilterAndTake<Integer>(predicate, 2)).subscribe(action);
}
于 2014-08-15T12:21:09.677 に答える
2

パーティーには少し遅れましたが、それがcompose存在する理由です:

Observable
.from(....)
.flatMap(... -> ....)
.compose(filterAndTake(15))
.subscribe(...)

public <T> Transformer<T,T> flterAndTake(int num) {
  return source -> source
     .filter(~Filter code~)
     .take(num);
}
于 2016-12-05T14:39:05.817 に答える