我想对Flux执行移动窗口计算,并生成包含计算值的Flux,但是我无法理解如何实现此目的。
作为一个简化的示例,假设我有一个整数通量,并且我想使用该通量中每3个连续整数的总和来产生一个新的通量。为了说明:
第一通量包含1到8的整数:{1、2、3、4、5、6、7、8}
结果通量应包含和:{1 + 2 + 3、2 + 3 + 4、3 + 4 + 5、4 + 5 + 6、5 + 6 + 7、6 + 7 + 8}
我可以很容易地产生第一个磁通量,并得出包含连续3个值的磁通量,如下所示:
Flux<Integer> f1 = Flux.range(1,8);
Flux<Flux<Integer>> f2 = f1.window(3,1);
我还可以对f2进行subscription()并计算总和,但是我不知道如何将这些总和作为新的Flux同时发布。
我错过了一些简单的东西,还是这种事情实际上很难做到?
答案 0 :(得分:1)
您可以在内部通量上使用.reduce(Integer::sum)
来执行窗口中元素的总和,在外部通量上使用.flatMap
可以将这些总和合并回到单个流中。
请注意,由于.window
是用maxSize < skip
调用的,因此尾随窗口中的项目少于最大大小。
Flux<Integer> sums = Flux.range(1, 8) // Flux<Integer>
.window(3, 1) // Flux<Flux<Integer>>
.flatMap(window -> window.reduce(Integer::sum)); // Flux<Integer>
StepVerifier.create(sums)
.expectNext(6) // 1+2+3
.expectNext(9) // 2+3+4
.expectNext(12) // 3+4+5
.expectNext(15) // 4+5+6
.expectNext(18) // 5+6+7
.expectNext(21) // 6+7+8
.expectNext(15) // 7+8
.expectNext(8) // 8
.verifyComplete();