像这样重新分配reactor Publisher Mono有什么问题吗



这有什么问题吗?

public static void test3() {
Mono<String> mono = Mono.just("");
System.out.println(mono);
for(int i=1; i<10; i++) {
mono = updateMono(mono, i);
System.out.println(mono);
}
mono.subscribe((s) -> System.out.println(s));
}
private static Mono<String> updateMono(Mono<String> mono, int i) {
return mono
.flatMap(s -> {
if (i % 2 == 0) {
return Mono.just(s + "-" + Integer.toString(i));
} else {
return mono;
}
});
}

它打印出预期输出

2-4-6-8

我想我在问是否有什么我不考虑的意外或副作用

这里查询的要点似乎是使用命令式循环来更新mono引用。

它本身没有任何错误,但我发现从风格的角度来看,如果可能的话,最好避免它-这意味着你不能只返回一个反应链,你必须声明它,强制修改它任意次数,然后返回它。

显然,这是一个人为的例子,但通常有不同的策略可以根据情况产生更清晰的代码:

  • 您可以选择使用Flux并将其降低,例如:

    Flux.range(1, 9)
    .filter(i -> i % 2 == 0)
    .map(i -> Integer.toString(i))
    .reduce((i1, i2) -> i1 + "-" + i2)
    .subscribe(System.out::println);
    
  • 您可以将循环重构为一个单独的方法,然后使用引用该方法的transform,至少可以保持主反应链的流程;

  • 如果";"真实世界";这个例子更自然地是递归的,而不是迭代的,那么切换到使用Flux,然后使用expand()expandDeep()将是最合乎逻辑的选择。

当然,如果它看起来很清楚,并且你对此感到满意,那么在反应管道中肯定有更糟糕的事情可以做——但在我遇到的大多数现实世界中的情况下,通常有一种更好的方法来呈现问题,从而避免了必要的循环。

最新更新