假设我有两种事件类型(A
和B
)和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
返回类型为的新值S
。 S
和sInitial
都是不可变的。
也就是说,我要:
是否有其他方法可以重组上述流,尤其是为了避免使用instanceof
?
答案 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));