将磁通量分成两个磁通量

时间:2019-11-04 15:52:56

标签: java spring-boot spring-webflux project-reactor

我想将通量分成两个通量,其中第一个通量只包含发射通量的第一项,第二个通量取其余的通量。

在对每种通量执行逻辑运算之后,我想将它们组合成一个通量。

例如:

S:是学生 S':应用myLogic

后的学生

发射通量:s1-> s2-> s3-> s4

第一个分裂通量:s1'=> myLogic 第二个分裂通量:s2'-> s3'-> s4'=> myLogic

组合通量:s1'-> s2'-> s3'-> s4'

4 个答案:

答案 0 :(得分:1)

使用标准的Flux方法takeskip来分离头尾元素就足够了。在此之前调用 cache 也有助于避免订阅重复。

class Util {

  static <T, V> Flux<V> dualTransform(
    Flux<T> originalFlux,
    int cutpointIndex,
    Function<T, V> transformHead,
    Function<T, V> transformTail
  ) {
    var cached = originalFlux.cache();
    var head = cached.take(cutpointIndex).map(transformHead);
    var tail = cached.skip(cutpointIndex).map(transformTail);

    return Flux.concat(head, tail);
  }

  static void test() {
    var sample = Flux.just("a", "b", "c", "d");

    var result = dualTransform(
                   sample,
                   1, 
                   x -> "{" + x.toUpperCase() + "}", 
                   x -> "(" + x + ")"
                 );

    result.doOnNext(System.out::print).subscribe();

    // prints: {A}(b)(c)(d)
  }
}

答案 1 :(得分:0)

您无需创建两个单独的Flux对象然后进行合并,而只需将原始Flux与另一个Flux<Boolean>压缩在第一个元素上即可。

然后,您可以在常规的true调用中根据需要有条件地进行处理,而不必稍后合并单独的发布者:

map()

答案 2 :(得分:0)

对于您的问题,有一个更简单的解决方案。您无需拆分并合并来自发布者的事件。您可以使用index()。它保留有关事件发布顺序的信息。

Flux<String> values = Flux.just("s1", "s2", "s3");
values.index((i, v) -> {
  if (i == 0) {
    return v.toUpperCase();
  } else {
    return v.toLowerCase();
  }
});

答案 3 :(得分:0)

这是一种骇人听闻的方法:

boolean a[] = new boolean[]{false};  //use an array as you cannot use non-final variables inside lambdas

    originalFlux
        .flatMap(a -> {
            if(!a[0]) {
                a[0] = true;
                return runLogicForFirst(a);
            } else {
                return runLogicForRest(a);
            }
        })