JavaRX加入两个不断更新的状态

时间:2017-02-02 21:03:54

标签: java rx-java reactive-programming

我有2个不断更新的状态:

  • 产品状态,其中包含产品列表(ID,名称,货币) 细胞,细胞货币价格)。
  • 货币汇率状态,其中包含当前货币汇率(货币, 以美元计价。)

这两个状态都由两个相应的直播流代表。确切地说,此上下文中的 state 只是一个虚拟视图,其中包含从流接收的数据的最新版本。我需要提供以下数据的实时流:产品ID,产品名称,美元价格。

这意味着我需要left join之类的内容,但需要流式数据。

为此,我尝试使用 RxJava groupJoin,但我遇到了两个问题:

  1. 我不能要求groupJoin仅为每个版本提供最新版本的数据 stream(加入产品或上一个产品的最后一种货币汇率) 版本与费率合并)。
  2. 我无法使用像HashMap这样的任何索引来改善加入(例如 按货币选择汇率作为关键),我只能迭代所有数据 (如全扫描)。
  3. 我该如何解决这些问题? RxJava 适用于我的目的吗?

2 个答案:

答案 0 :(得分:0)

尝试使用ConcurrentHashMap<K,V>

  

检索操作(包括get)一般不会阻塞,所以可能   与更新操作重叠(包括put和remove)。检索   反映最近完成的更新操作的结果   坚持他们的发作。对于诸如putAll和。之类的聚合操作   清除,并发检索可能仅反映插入或删除   一些条目。同样,Iterators和Enumerations返回元素   反映哈希表的状态在某个时刻或之后的某个时刻   创建迭代器/枚举。他们不扔   ConcurrentModificationException的。但是,迭代器的设计是   一次仅由一个线程使用

引自Documentaiton of ConcurrentHashMap 我认为是您想要和需要的最佳选择。

答案 1 :(得分:0)

我认为您正在寻找CombineLatest运营商。它的工作方式类似于zip操作,但每次任何源observables发出项目时都会发出新项目。

使用此运算符,您将始终获得最新的ProductStateCurrencyRate

你可以这样做(Kotlin语法):

Observable.combineLatest(productStream, currencyStream) { product, currency ->
    NewView(product.id, product.name, product.price * currency.rate)
}