Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅调用onComplete时scala rx观测值上的映射_Scala_Rx Java_Rx Scala_Couchbase Java Api - Fatal编程技术网

仅调用onComplete时scala rx观测值上的映射

仅调用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

我使用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 => 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))
  ...
}