像这样重新分配React堆有什么问题吗?

ecbunoof  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(249)

这有什么问题吗?

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
我想我是在问是否有什么意想不到的或副作用,我没有考虑

snz8szmq

snz8szmq1#

这里的主要问题似乎是使用命令式循环来更新 mono 参考文献。
它本身没有什么问题,但我发现从样式的Angular 来看,如果可能的话,最好避免使用它—这意味着不能只返回单个React链,必须声明它,强制修改任意次数,然后返回它。
很明显,这是一个人为的例子,但通常有不同的策略,你可以采取,导致更清晰的代码,视情况而定:
你可以选择使用 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 ,引用该方法,以至少保持主React链的流继续;
如果“真实世界”的示例更自然地是递归的,而不是迭代的,那么切换到使用 Flux 然后利用 expand() 或者 expandDeep() 是最合乎逻辑的选择。
当然,如果它看起来很清楚,并且你对此感到满意,那么在React式管道中肯定有更糟糕的事情可以做——但是在我遇到的大多数实际案例中,通常有一种更好的方式来表示问题,从而避免了对命令式循环的需要。

相关问题