1

リアクティブ プログラミング (RxGroovy) を使用して、プロパティ値がデータベース クエリから取得されるビルダー パターンを使用してオブジェクトを作成しようとしています。まず、どうやってそれを行うか、そして次に、それが良いアイデアかどうかについての考えを探しています。

作成しようとしているオブジェクトは次のタイプです。

class Foo {
    final String name;
    final Long[] relatedIds;

    Foo(String name, Long[] relatedIds) {
        this.name = name;
        this.relatedIds = relatedIds;
    }
}

そしてビルダー:

class FooBuilder {
    String name;
    LinkedList<Long> relatedIds;

    {
        relatedIds = new LinkedList<>();
    }

    FooBuilder name(String name) {
        this.name = name;
        return this;
    }

    FooBuilder relatedId(Long id) {
        this.relatedIds.add(id);
        return this;
    }

    Foo build() {
        return new Foo(this.name, this.relatedIds.toArray());
    }

}

すべての Foo オブジェクトの名前を返すクエリと、関連するすべての ID を取得するために Foo オブジェクトごとに 1 回実行する別のクエリの 2 つのクエリがあります。

queryAsObservableクエリを実行し、結果セットの各行を発行する Observable を取得するためのメソッド (それを呼び出す) が既にあります。を設定すると、次のnameようになります。

Observable<FooBuilder> buidlersWithNameSet = queryAsObservable(queryAllFoos)
.map { return new FooBuilder().name(it.name); }

を指定するFooBuilderと、次のように relatedIds を設定できます。

final FooBuilder builder;
queryAsObservable(queryRelatedIds, builder.name)
    .subscribe { builder.relatedId(it.id); }

私の問題は、2つを結び付ける方法ですか?FooBuilder示されているように、最初のオブザーバブルによって発行されたそれぞれについて、関連する ID を設定するためにオブザーバブルを作成するにはどうすればよいですか? 最後に、すべてのFooBuilderオブジェクトを取得し、 プロパティnamerelatedIdsプロパティをすべて設定する必要があります。

JOINに関する注意

JOIN を使用して、関連する ID と名前をすべて 1 つのクエリで取得できることを知っています。私の考えでは、すべての結果が到着するのを待ってからオブジェクトを順番に構築するのではなく、並行して実行される多くの小さなクエリを使用し、Observable ストリームを使用して結果が利用可能になるたびに各結果の作業を行うことができます。なぜそれが良いアイデアなのか悪いアイデアなのかについて、私は自由に考えています。

4

1 に答える 1

2

Observable を組み合わせるには、flatMap() を使用します。Groovy の構文はよくわかりませんが、試してみます。あなたから始まるbuilderWithNameSet

Observable<FooBuilder> completeBuilder =
    buildersWithNameSet
        .flatMap { builder ->
            return queryAsObservable(queryRelatedIds, builder.name)
                .map { builder.relatedId(it.id); }
        }
于 2015-07-22T17:10:46.713 に答える