java - 使用 Flux 持续减少状态
问题描述
假设我有两种事件类型 ( A
and B
) 和Flux
es 以某种方式生成它们:
Flux<A> aFlux = ...;
Flux<B> bFlux = ...;
还有一个保存当前状态的类型,由 type 表示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
返回 type 的新值开始S
。S
和都是sInitial
不可变的。
也就是说,我想:
- 不断输出最新状态...
- ...正在生成...
- ...基于当前状态和接收到的事件...
- ...按照映射器函数的规定
有没有办法以其他方式重组上述流,尤其是为了避免使用instanceof
?
解决方案
您可以添加接口并为您的 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));
推荐阅读
- python - Python中谷歌云语音的类型类中不显示重要函数
- python - 为什么即使在其中附加项目后,我也会在 python 中得到空白列表作为输出?
- angular - AppModule 为每个路由重新初始化
- php - 在 html 表中创建多个表单元素以更新 SQL 表
- python - 将数据集转换为 Numpy 数组的问题
- r - 使用估计的密度函数时进行积分
- php - 如何在 php 中访问电报 bot 的先前消息值?
- r - 使用循环绘制具有多个 geom_lines 的图形
- delphi - Firedac TFDquery.RowsAffected - 当应该返回 0 时返回 1
- reactjs - 使用 ReactJs 和 Typescript 在组件中调用主题道具时出错