我找到了我的问题的答案。 Flux#distinct 可以采用提供初始状态的Supplier 和执行“不同”检查的BiPredicate,因此我们可以在存储中存储任意状态并决定是否保留每个元素。
以下代码展示了如何在不改变顺序的情况下保留每个 mod2 组的前 3 个元素。
// Get first 3 elements per mod 2.
Flux<Integer> first3PerMod2 =
Flux.fromIterable(ImmutableList.of(9, 3, 7, 4, 5, 10, 6, 8, 2, 1))
.distinct(
// Group by mod2
num -> num % 2,
// Counter to store how many elements have been processed for each group.
() -> new HashMap<Integer, Integer>(),
// Increment or set 1 to the counter,
// and return whether 3 elements are published.
(map, num) -> map.merge(num, 1, Integer::sum) <= 3,
// Clean up the state.
map -> map.clear());
StepVerifier.create(first3PerMod2).expectNext(9, 3, 7, 4, 10, 6).verifyComplete();