仅调用onComplete时scala rx观测值上的映射
我使用scala observables从couchbase获取项目,然后使用map、flatMap、zip转换结果。问题是,如果couchbase中不存在项,那么例如.zip并不是只调用onComplete。例如:仅调用onComplete时scala rx观测值上的映射,scala,rx-java,rx-scala,couchbase-java-api,Scala,Rx Java,Rx Scala,Couchbase Java Api,我使用scala observables从couchbase获取项目,然后使用map、flatMap、zip转换结果。问题是,如果couchbase中不存在项,那么例如.zip并不是只调用onComplete。例如: import rx.lang.scala._ def getIdsWithValues(ids: Seq[String]): Map[K, V] = { val values = Observable.from(keyValueIds).flatMap(id => co
import rx.lang.scala._
def getIdsWithValues(ids: Seq[String]): Map[K, V] = {
val values = Observable.from(keyValueIds).flatMap(id => couchbaseBucket.async().get(id))
values.zip(Observable.from(ids)) // zip is not called if no row in couchbase with id.
...
}
所以我想:
返回一个k->v的映射
我让.zip将k与返回的v进行耦合,如果v不存在的话,我希望v类似于None。
我看到,如果数据库中不存在任何项,则根本不会调用zip。
我想到在运行上述代码之后,扫描ids输入参数,并为每个未压缩值的参数添加一个id到它的值中,但这就像添加另一个流,我希望zip处理现有和不存在的行
我该怎么处理?如何使.zip处理现有行和不存在行?不要使用zip运算符。相反,只需使用flatMap和materialize.take1。materialize将onComplete事件转换为可以映射为None的通知,而具有值的通知将映射为Somevalue
.materialize.take1.map res=>如果res.isOnComplete id、None-else id、Someres.getValue可以替换为just.headOption。
def getIdsWithValues(ids: Seq[String]): Map[K, V] = {
val values = Observable.from(keyValueIds)
.flatMap(id => couchbaseBucket.async()
.get(id)
.materialize()
.take(1)
.map( res => if ( res.isOnComplete() )
(id, None)
else
(id, Some(res.getValue))
...
}