如何使用状态过滤通量?

时间:2018-11-12 06:38:50

标签: project-reactor

我想根据从先前的值计算得出的状态,将filter应用于我的Flux。但是,建议避免根据the javadoc

在运算符中使用状态
  

请注意,应避免在Flux运算符中使用的java.util.function / lambdas中使用状态,因为这些状态可能在多个订户之间共享。

例如,Flux#distinct过滤以前出现的项目。我们如何实现自己的distinct版本?

1 个答案:

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