我想将通量分成两个通量,其中第一个通量只包含发射通量的第一项,第二个通量取其余的通量。
在对每种通量执行逻辑运算之后,我想将它们组合成一个通量。
例如:
S:是学生 S':应用myLogic
后的学生发射通量:s1-> s2-> s3-> s4
第一个分裂通量:s1'=> myLogic 第二个分裂通量:s2'-> s3'-> s4'=> myLogic
组合通量:s1'-> s2'-> s3'-> s4'
答案 0 :(得分:1)
使用标准的Flux
方法take
和skip
来分离头尾元素就足够了。在此之前调用 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);
}
})