作为一个简单的例子,我有一个依赖于另一个单声道的单声道。通常我会使用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
的一种方式。