groovy - 响应式编程的构建器模式

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

我正在尝试使用响应式(Reactive)编程(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,我可以像这样设置 relatedId:

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

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

关于 JOIN 的注意事项

我知道我可以通过 JOIN 在一个查询中获取所有相关 ID 和名称。我的想法是,我可以使用并行运行的许多较小的查询,并在结果可用时使用 Observable 流为每个结果完成工作,而不是等待所有结果进入,然后串行构建对象。我愿意接受关于为什么这是好主意或坏主意的想法。

最佳答案

要组合 Observables,请使用 flatMap()。不确定 Groovy 语法,但我会尝试一下。从您的 builderWithNameSet 开始:

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

关于groovy - 响应式编程的构建器模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31566969/

相关文章:

java - RxJava- cache() 和 replay() 一样吗?

rxjs - Rx - 如何应用于流distinctUntilChanged,允许在一段时间后发出重复的项目?

android - 如何在 RxJava 2 和 Kotlin 中将 null 传递给具有可空类型的 Observable

groovy - 链接为零的安全算子

eclipse - 在 Groovy-Eclipse 中导入 DSL 的自定义内容

java - java中异步进程的技术和设计

rx-java - 并行数据库搜索的 Schedulers.io()

android - 如何使用 rx java 的间隔进行后台任务

jenkins - 在 Jenkins 管道中使用 agent none 定义环境变量

java - 如何测试一个方法及其两个助手之间的交互?