Java 接收观测值:为每个原始项目发射额外项目,将其减少为另一种类型,消耗
我在使用Couchbase Java client 2.2.2和Rx Observables 1.0.15执行以下操作时遇到问题: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
- 我有一个字符串列表,这些字符串是文档名
- 随着每个文档名的原始文档,我想加载另一个文档(从原始文档名推断),这样我就可以得到一对文档。如果这两个文档中的任何一个不存在,请不要再使用这一对
- 如果该对有效(即两个文档都存在),则使用这两个文档从它们创建自定义对象
- 将这些转换的项合并到一个列表中
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它已经是最小的。如果