通量连续减少状态

时间:2019-03-26 22:53:48

标签: java project-reactor

假设我有两种事件类型(AB)和Flux es以某种方式生成它们:

Flux<A> aFlux = ...;
Flux<B> bFlux = ...;

,还有一个保存由类型S表示的当前状态的类型:

class S {
  final int val;
}

我要创建以下内容:

final S sInitial = ...;

Flux<S> sFlux = Flux.merge(aFlux, bFlux)
  .scan((a, e) -> {
    if(e instanceof A) {
      return mapA(a, (A)e);
    } else if(e instanceof B) {
      return mapB(a, (B)e);
    } else {
      throw new RuntimeException("invalid event");
    }
  })
  .startWith(sInitial);

其中sCurr是sFlux最后输出的S的实例,从sInitial开始,mapA / mapB返回类型为的新值SSsInitial都是不可变的。

也就是说,我要:

  • 连续输出最新状态...
  • ...正在生成...
  • ...基于当前状态和接收到的事件...
  • ...映射器功能所规定的

是否有其他方法可以重组上述流,尤其是为了避免使用instanceof

1 个答案:

答案 0 :(得分:0)

您可以添加接口并为您的A和B类实现它

interface ToSConvertible {
    S toS(S s);
}

现在您可以使用reactor.core.publisher.Flux#scan(A, java.util.function.BiFunction<A,? super T,A>)方法:

Flux<S> sFlux = Flux.merge(aFlux, bFlux)
        .scan(sInitial, (s, e) -> e.toS(s));