Reactive Mono::zip,元素之间相互依赖



作为一个简单的例子,我有一个依赖于另一个单声道的单声道。通常我会使用Mono::flatMap来链接发布者。然而,我发现使用Mono::zip也是可行的。这是"允许的"还是一个好主意或坏主意?为什么?

Mono<String> a = Mono.just("A");
Mono<String> b = Mono.just("B");
Mono<String> c = Mono.just("C");
Mono<String> d = Mono.just("D");
Mono<String> ae = a.flatMap(am->Mono.just(am.concat("E")));
Mono.zip(a, b, c, d, ae).subscribe(System.out::println);

作为一个额外的想法:

Mono<String> monoA = Mono.just("A");
Mono<String> monoB = Mono.just("B");
Mono<String> a = something(monoA);
Mono<String> b = something(monoB);
Mono<String> c = something(monoA);
Mono<String> d = something(monoA);
Mono<String> ae = something(a);
Mono.zip(a, b, c, d, ae).subscribe(System.out::println);

更新:我可以添加一个例程来模拟调用API的用例,比如:

private Mono<String> getOne() {
    System.out.println("Here 1");
    return Mono.just("A");
}

然后我可以将第一行更改为,如下所示

Mono<String> a = Mono.from(getOne()).doOnNext(System.out::println);

这确实表明a被发射了两次,但只被构造了一次。当考虑处理这种情况的"正确"方法时,两次发射可能是一个很小的代价,比如:

Mono<String> a = Mono.from(getOne()).doOnNext(System.out::println);
Mono<String> b = Mono.just("B");
Mono<String> c = Mono.just("C");
Mono<String> d = Mono.just("D");
Mono.zip(a, b, c, d).flatMap(tuple4->{
    return Mono.just(tuple4.getT1().concat("E")).map(ae->{
        // here I have everything I need   
        return String.format("[%s,%s,%s,%s,%s]", tuple4.getT1(), tuple4.getT2(), tuple4.getT3(), tuple4.getT4(), ae);
    });
}).subscribe(System.out::println);

在平面图中publisher a需要完成,直到您可以执行B,所以它将串行执行。

当使用zip时,publisher A或B可以获得第一名或第二名,这无关紧要,直到两者都完成后才会继续。它将并行运行。

您还可以查看zipWith函数,它是以串行方式组合publishers的一种方式。

最新更新