生成器模式与反应式编程

时间:2015-07-22 15:03:19

标签: groovy reactive-programming rx-java builder-pattern rx-groovy

我尝试使用反应式编程(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对象的名称,然后是一个单独的查询,我为每个Foo对象运行一次以获取所有相关的ID。

我已经有了一个方法(称之为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); }

我的问题是如何将两者结合在一起?如何创建observable来为第一个observable发出的每个FooBuilder设置相关的ID,如图所示?最后,我只需要获取所有FooBuilder个对象,并设置namerelatedIds属性。

关于JOIN的注意事项

我知道我可以通过JOIN在一个查询中获取相关的ID和名称。我的想法是我可以使用大量并行运行的小型查询,并使用Observable流为每个结果执行工作,因为结果可用,而不是等待所有结果进入然后串行构建对象。我对这个好主意或坏主意的想法持开放态度。

1 个答案:

答案 0 :(得分:2)

要组合Observable,请使用flatMap()。不确定Groovy语法,但我会拍摄。从您的builderWithNameSet开始:

Observable<FooBuilder> completeBuilder =
    buildersWithNameSet
        .flatMap { builder ->
            return queryAsObservable(queryRelatedIds, builder.name)
                .map { builder.relatedId(it.id); }
        }