将磁通量分成两个磁通量

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

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

例如:

S:是学生 S':应用myLogic

后的学生

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

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

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

lxx1990123 回答:将磁通量分成两个磁通量

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

class Util {

  static <T,V> Flux<V> dualTransform(
    Flux<T> originalFlux,int cutpointIndex,Function<T,V> transformHead,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)
  }
}
,

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

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

map()
,

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

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

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

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);
            }
        })
本文链接:https://www.f2er.com/3165458.html

大家都在问