在 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]]
我想做类似于 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]]