我想根据从先前的值计算得出的状态,将filter
应用于我的Flux
。但是,建议避免根据the javadoc
请注意,应避免在Flux运算符中使用的java.util.function / lambdas中使用状态,因为这些状态可能在多个订户之间共享。
例如,Flux#distinct
过滤以前出现的项目。我们如何实现自己的distinct
版本?
答案 0 :(得分:1)
我找到了我问题的答案。 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();