Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.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
Java 接收观测值:为每个原始项目发射额外项目,将其减少为另一种类型,消耗_Java_Couchbase_Rx Java_Observable_Couchbase Java Api - Fatal编程技术网

Java 接收观测值:为每个原始项目发射额外项目,将其减少为另一种类型,消耗

Java 接收观测值:为每个原始项目发射额外项目,将其减少为另一种类型,消耗,java,couchbase,rx-java,observable,couchbase-java-api,Java,Couchbase,Rx Java,Observable,Couchbase Java Api,我在使用Couchbase Java client 2.2.2和Rx Observables 1.0.15执行以下操作时遇到问题: 我有一个字符串列表,这些字符串是文档名 随着每个文档名的原始文档,我想加载另一个文档(从原始文档名推断),这样我就可以得到一对文档。如果这两个文档中的任何一个不存在,请不要再使用这一对 如果该对有效(即两个文档都存在),则使用这两个文档从它们创建自定义对象 将这些转换的项合并到一个列表中 到目前为止,我所想到的看起来确实意味着: List<E> re

我在使用Couchbase Java client 2.2.2和Rx Observables 1.0.15执行以下操作时遇到问题:

  • 我有一个字符串列表,这些字符串是文档名
  • 随着每个文档名的原始文档,我想加载另一个文档(从原始文档名推断),这样我就可以得到一对文档。如果这两个文档中的任何一个不存在,请不要再使用这一对
  • 如果该对有效(即两个文档都存在),则使用这两个文档从它们创建自定义对象
  • 将这些转换的项合并到一个列表中
到目前为止,我所想到的看起来确实意味着:

List<E> resultList = new ArrayList<>();

Observable
    .from(originalDocumentNames)
    .flatmap(key -> {
        Observable firstDocument = bucket.async().get(key);
        Observable secondDocument = bucket.async().get(getSecondKeyNameFrom(key));
        return Observable.merge(firstDocument, secondDocument);
    })
    .reduce((jsonDocument1, jsonDocument2) -> {
        if (jsonDocument1 == null || jsonDocument2 == null) {
            return null;
        }
        resultList.add(createCustomObject(jsonDocument1, jsonDocument2);
        return null;
    })
    .filter(Objects.nonNull)
    .singleOrDefault(null)
    .subscribe(new Subscriber<E>() {
        public void onComplete() {
            //use resultList in a callback function
        }
    });
List resultList=new ArrayList();
可观察
.发件人(原始文档名)
.flatmap(键->{
可观察的firstDocument=bucket.async().get(键);
Observable secondDocument=bucket.async().get(getSecondKeyNameFrom(key));
返回可观察的。合并(第一个文档,第二个文档);
})
.reduce((jsonDocument1,jsonDocument2)->{
if(jsonDocument1==null | | jsonDocument2==null){
返回null;
}
添加(createCustomObject(jsonDocument1,jsonDocument2);
返回null;
})
.filter(Objects.nonNull)
.singleOrDefault(空)
.subscribe(新订户(){
未完成的公共空间(){
//在回调函数中使用resultList
}
});
这不起作用。我不知道在哪里,但我认为我使用的是
Observable.merge
错误的方法。 此外,我认为我处理整个问题的方式是错误的

因此,主要问题似乎是:

  • 如何向可观测流发射附加项
  • 如何将两个项目减少为另一类型的项目?(减少(T,T,T)不允许)
  • 我做错了吗

您可以在平面图中使用
zip
。zip将以最少的项目发出与
可观察到的项目一样多的项目。因此,如果其中一个文档丢失,其序列将为空,zip将跳过它

Observable
.from(originalDocumentNames)
.flatmap(key -> {
    //the stream of 0-1 original document
    Observable firstDocument = bucket.async().get(key);
    //the stream of 0-1 associated document
    Observable secondDocument = bucket.async().get(getSecondKeyNameFrom(key));

    //using zip and the createCustomObject method reference as a zip function to combine pairs of documents
    return Observable.zip(firstDocument, secondDocument, this::createCustomObject);
})
.toList() //let RxJava aggregate into a List
.subscribe(
    //the "callback" function, onNext will be called only once with toList
    list -> doSomething(list), 
    //always try to define onError (best practice)
    e -> processErrors(e)
);

您可以在flatmap中使用
zip
。zip将以最少的项目发出与
可观察到的项目一样多的项目。因此,如果其中一个文档丢失,其序列将为空,zip将跳过它

Observable
.from(originalDocumentNames)
.flatmap(key -> {
    //the stream of 0-1 original document
    Observable firstDocument = bucket.async().get(key);
    //the stream of 0-1 associated document
    Observable secondDocument = bucket.async().get(getSecondKeyNameFrom(key));

    //using zip and the createCustomObject method reference as a zip function to combine pairs of documents
    return Observable.zip(firstDocument, secondDocument, this::createCustomObject);
})
.toList() //let RxJava aggregate into a List
.subscribe(
    //the "callback" function, onNext will be called only once with toList
    list -> doSomething(list), 
    //always try to define onError (best practice)
    e -> processErrors(e)
);

这段代码中有几个问题:

  • 副作用,
    reduce
    操作将添加到
    可观察的
    链之外的列表中,这是错误的。
    reduce
    应该返回列表,或者根本不存在,因为Rx有一个
    toList
    操作。另外,由于reduce操作返回
    null
    下一个操作必须执行请记住,这太不雅观了

  • merge
    操作错误,应改为
    flatmap
    中的
    zip
    ,并构建对/聚合

  • 可选点:如果get操作返回多个项目,flatmap操作不会处理(couchbase可能就是这种情况)


  • 请注意,我没有IDE,所以现在没有代码。但在我看来,用
    zip
    替换
    merge
    和删除
    reduce
    肯定会有帮助。

    这段代码中有几个问题:

  • 副作用,
    reduce
    操作将添加到
    可观察的
    链之外的列表中,这是错误的。
    reduce
    应该返回列表,或者根本不存在,因为Rx有一个
    toList
    操作。另外,由于reduce操作返回
    null
    下一个操作必须执行请记住,这太不雅观了

  • merge
    操作错误,应改为
    flatmap
    中的
    zip
    ,并构建对/聚合

  • 可选点:如果get操作返回多个项目,flatmap操作不会处理(couchbase可能就是这种情况)


  • 请注意,我没有IDE,所以现在还没有代码。但在我看来,用
    zip
    替换
    merge
    和删除
    reduce
    肯定会有帮助。

    我对RxJava没有太多经验-主要是在Scala世界中工作,但扩展元素的正常方式正是您正在做的:您或者
    flatMap
    ,例如如果可以立即提供扩展,可以根据需要扩展或收缩元素,或者使用
    flatMapIterable
    。您可能想要做的(以及指南告诉您的)是减少示例,删除所有细节(什么是
    bucket
    ?为什么有人会在意?)直到你有一个最小的自我包含的例子来重现这个问题。它很可能会帮助你解决问题。你可能想使用zip()函数,而不是merge()和reduce()。@alf它已经是最小的。如果Couchbase应用程序非常清楚,则在上下文中使用“bucket”。@johncastergood当使用zip()时处理后的元素重叠。我想发出两个项目,将这两个项目处理成一个新的项目,并且在下一个处理步骤中不使用任何原始项目。我对RxJava没有太多经验-主要在Scala世界中工作,但扩展元素的正常方式正是您正在做的:您要么
    flatMap
    ,要么扩展,要么shr如果可以立即提供扩展,可以根据需要为元素添加墨水,或者使用
    flatMapIterable
    。您可能想要做的(以及指南告诉您的)是减少示例,删除所有细节(什么是
    bucket
    ?为什么有人会在意?)直到你有一个最小的自我包含的例子重现这个问题。它很可能会帮助你解决问题。你可能想使用zip()函数,而不是merge()和reduce()。@alf它已经是最小的。如果