我有一个Status
类,表示某些任务状态。我有一个带有以下签名的方法
def update(existing: Status, update: Status): Status
该函数采用旧状态并进行新的更新,并返回结合这两者的新Status
对象。
我希望从自定义主题中获得以下行为:
写行为
Status
的实例。我们称之为current
Flowable<Status>
Flowable
进行)上,它都会如上所述调用update
方法并将结果存储在current
中。阅读行为
Flowable.interval(1 second).map(i->current)
我可以使用StatusHolder
类的写行为(进行保存和更新)以及对Flowable.interval(1 second).map(i->holder.current)
的单独订阅来实现上述目的。
实施此操作后,我遇到了Subject
和Observable
的概念。我想要的功能与此类似。我想要一个既可以接收也可以发出Observer
对象的类,但是需要在接收时进行一些计算。
我查看了现有的Status
实现,但我认为其中没有一个自然支持这种行为。第二件事是,它们在Subject
而不是Observable
上运行,所以我需要做Flowable
和toFlowable
来使用它。
是否有更好的方法来实现这种行为?
答案 0 :(得分:0)
让我们将source
定义为您的来源Flowable<Status>
。
Flowable<Status> source = ...
然后您可以尝试以下操作:
Flowable.interval(1, TimeUnit.SECONDS)
.withLatestFrom(source.scan(this::update), (i, status) -> status)
.share();
.interval()
运算符会定期发出一个长值。.scan()
运算符“累积”源流发出的项目。您的情况是累加器是.update
函数.withLatestFrom()
合并了两个流。这将取代您的.map(i->holder.current)
.share()
允许所有订阅者共享一个订阅。
小注:
有Flowable
的{{1}}版本,称为Subject
。