RxJava 2中的累积和发射行为

时间:2019-06-21 16:12:18

标签: rx-java reactive-programming rx-java2 reactive

我有一个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)的单独订阅来实现上述目的。

实施此操作后,我遇到了SubjectObservable的概念。我想要的功能与此类似。我想要一个既可以接收也可以发出Observer对象的类,但是需要在接收时进行一些计算。

我查看了现有的Status实现,但我认为其中没有一个自然支持这种行为。第二件事是,它们在Subject而不是Observable上运行,所以我需要做FlowabletoFlowable来使用它。

是否有更好的方法来实现这种行为?

1 个答案:

答案 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