在 Flux 中组合两个连续的元素

Combining two consecutive elements in a Flux

我想做类似于 zipWith 的事情,但我想压缩元素流及其自身和偏移量 1。换句话说,我想创建一个元素流,每个元素都是原始流中两个连续元素的组合。

示例:

我要像这样改造一个 Flux:

final var events = Flux.just(10, 20, 30, 40);

到由这些元组组成的 Flux 中(例如使用 org.apache.commons.lang3.tuple.Pair 左右):

[(10, 20), (20, 30), (30, 40)]

新流的总长度为 n-1

刚刚自己找到了答案。

final var events = Flux.just(10, 20, 30, 40);
final var tuples = events.zipWith(events.skip(1));

查看buffer:

events.buffer(2, 1);

这会生成大小为 2 的缓冲区,并在每个元素 (1) 上打开一个缓冲区。 请注意,在偶数个源元素的情况下,最后一个缓冲区将包含一个条目:

[[10, 20], [20, 30], [30, 40], [40]]

然后可以用filter:

消除
events.buffer(2, 1)
    .filter(b -> b.size() > 1);

产生:

[[10, 20], [20, 30], [30, 40]]