具有反应式编程的构建器模式
Builder pattern with reactive programming
我正在尝试使用反应式编程 (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());
}
}
我有两个查询,一个是 returns 所有 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); }
我的问题是如何将两者联系在一起?如何创建可观察对象以设置相关 ID,如图所示,为第一个可观察对象发出的每个 FooBuilder
?最后,我只需要获取所有 FooBuilder
对象,并设置 name
和 relatedIds
属性。
关于 JOIN 的注意事项
我知道我可以通过 JOIN 在一次查询中获取相关的 ID 和名称。我的想法是我可以并行使用许多较小的查询 运行ning 并使用 Observable 流在结果可用时为每个结果完成工作,而不是等待所有结果都进来然后构建对象串行。我乐于接受关于为什么这是好主意或坏主意的想法。
要组合 Observables,请使用 flatMap()。不确定 Groovy 语法,但我会试一试。从您的 builderWithNameSet
开始:
Observable<FooBuilder> completeBuilder =
buildersWithNameSet
.flatMap { builder ->
return queryAsObservable(queryRelatedIds, builder.name)
.map { builder.relatedId(it.id); }
}
我正在尝试使用反应式编程 (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());
}
}
我有两个查询,一个是 returns 所有 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); }
我的问题是如何将两者联系在一起?如何创建可观察对象以设置相关 ID,如图所示,为第一个可观察对象发出的每个 FooBuilder
?最后,我只需要获取所有 FooBuilder
对象,并设置 name
和 relatedIds
属性。
关于 JOIN 的注意事项
我知道我可以通过 JOIN 在一次查询中获取相关的 ID 和名称。我的想法是我可以并行使用许多较小的查询 运行ning 并使用 Observable 流在结果可用时为每个结果完成工作,而不是等待所有结果都进来然后构建对象串行。我乐于接受关于为什么这是好主意或坏主意的想法。
要组合 Observables,请使用 flatMap()。不确定 Groovy 语法,但我会试一试。从您的 builderWithNameSet
开始:
Observable<FooBuilder> completeBuilder =
buildersWithNameSet
.flatMap { builder ->
return queryAsObservable(queryRelatedIds, builder.name)
.map { builder.relatedId(it.id); }
}