如何对通量执行移动窗口计算并将结果作为新的通量输出

时间:2019-06-03 16:46:20

标签: java project-reactor

我想对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同时发布。

我错过了一些简单的东西,还是这种事情实际上很难做到?

1 个答案:

答案 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();