Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.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
Rx java Rxjava2-如何让观测者在第一个项目之后停止发射项目或使用zipWith?_Rx Java_Rx Java2 - Fatal编程技术网

Rx java Rxjava2-如何让观测者在第一个项目之后停止发射项目或使用zipWith?

Rx java Rxjava2-如何让观测者在第一个项目之后停止发射项目或使用zipWith?,rx-java,rx-java2,Rx Java,Rx Java2,下面的代码可以使网络调用正常。但它不断地发出同样的结果。我只想取得第一个结果并停止排放。有没有一个命令我可以说只是发出第一个。我尝试使用(1),但由于某种原因更改了结果大小 //class variables FeedsModel feedsModelResult; HashMap<Integer, ProductModel> productMap; //method @Override protected Observable buildUse

下面的代码可以使网络调用正常。但它不断地发出同样的结果。我只想取得第一个结果并停止排放。有没有一个命令我可以说只是发出第一个。我尝试使用(1),但由于某种原因更改了结果大小

//class variables
  FeedsModel feedsModelResult;
    HashMap<Integer, ProductModel> productMap;

//method

    @Override
       protected Observable buildUseCaseObservable() {
           /* gets feedModel then parses through each feed for product IDs. then does a network call to get each product. stores retrieved
           product model in hashmap for quick retrieval. returns a pair.
            */
           return feedRepository.fetchFeeds(shopId, langId, skip)
                   .concatMap(new Function<FeedsModel, ObservableSource<List<Feed>>>() {
                       @Override
                       public ObservableSource<List<Feed>> apply(@NonNull final FeedsModel feedsModel) throws Exception {
                           feedsModelResult = feedsModel;
                           return Observable.fromCallable(new Callable<List<Feed>>() {
                               @Override
                               public List<Feed> call() throws Exception {

                                   return feedsModel.getFeed();
                               }
                           });
                       }
                   })
                   .concatMap(new Function<List<Feed>, ObservableSource<Feed>>() {
                       @Override
                       public ObservableSource<Feed> apply(@NonNull List<Feed> feeds) throws Exception {

                           return Observable.fromIterable(feeds);
                       }
                   }).filter(new Predicate<Feed>() {
                       @Override
                       public boolean test(@NonNull Feed feed) throws Exception {
                           return feed.getProducts() != null;
                       }
                   })
                   .concatMap(new Function<Feed, ObservableSource<Double>>() {
                       @Override
                       public ObservableSource<Double> apply(@NonNull Feed feed) throws Exception {
                           return Observable.fromIterable((ArrayList<Double>) feed.getProducts());
                       }
                   })
                   .concatMap(new Function<Double, ObservableSource<ProductModel>>() {
                       @Override
                       public ObservableSource<ProductModel> apply(@NonNull Double productId) throws Exception {
                           return productsRepository.fetchProduct(productId.intValue(), shopId, langId, currency);
                       }
                   }).concatMap(new Function<ProductModel, ObservableSource<Map<Integer, ProductModel>>>() {
                       @Override
                       public ObservableSource apply(@NonNull ProductModel productModel) throws Exception {

                           productMap.put(productModel.getIdProduct(), productModel);
                           return Observable.fromCallable(new Callable<Map<Integer, ProductModel>>() {
                               @Override
                               public Map<Integer, ProductModel> call() throws Exception {
                                   return productMap;
                               }
                           });
                       }
                   }).concatMap(new Function<Map<Integer, ProductModel>, ObservableSource<Pair>>() {
                       @Override
                       public ObservableSource apply(@NonNull final Map<Integer, ProductModel> productModelMap) throws Exception {
                           return Observable.fromCallable(new Callable() {
                               @Override
                               public Object call() throws Exception {
                                   return Pair.create(feedsModelResult, productMap);
                               }
                           });
                       }
                   });
       }
//类变量
FeedsModel feedsModelResult;
HashMap-productMap;
//方法
@凌驾
受保护的可观察buildUseCaseObservable(){
/*获取feedModel,然后解析每个提要中的产品ID。然后执行网络调用以获取每个产品。检索存储
hashmap中的产品模型,用于快速检索。返回一对。
*/
return feedRepository.fetchFeeds(shopId、langId、skip)
.concatMap(新函数(){
@凌驾
公共ObserviceSource apply(@NonNull final FeedsModel FeedsModel)引发异常{
feedsModelResult=feedsModel;
返回Observable.fromCallable(newcallable()){
@凌驾
公共列表调用()引发异常{
返回feedsModel.getFeed();
}
});
}
})
.concatMap(新函数(){
@凌驾
public observesource apply(@NonNull List feed)引发异常{
返回可观察。从可观察(馈送);
}
}).filter(新谓词(){
@凌驾
公共布尔测试(@NonNull Feed)引发异常{
return feed.getProducts()!=null;
}
})
.concatMap(新函数(){
@凌驾
公共ObserviceSource apply(@NonNull提要)引发异常{
返回Observable.fromIterable((ArrayList)feed.getProducts());
}
})
.concatMap(新函数(){
@凌驾
public observesource apply(@NonNull Double productId)引发异常{
return productsRepository.fetchProduct(productId.intValue(),shopId,langId,currency);
}
}).concatMap(新函数(){
@凌驾
公共ObserviceSource apply(@NonNull ProductModel ProductModel)引发异常{
productMap.put(productModel.getIdProduct(),productModel);
返回Observable.fromCallable(newcallable()){
@凌驾
公共映射调用()引发异常{
返回productMap;
}
});
}
}).concatMap(新函数(){
@凌驾
public observesource apply(@NonNull final Map productModelMap)引发异常{
返回Observable.fromCallable(newcallable()){
@凌驾
公共对象调用()引发异常{
返回Pair.create(feedsModelResult、productMap);
}
});
}
});
}
更新: 在onSubscribe中,我保留对一次性文件的引用,并在得到第一个结果后在onNext()中处理它。这样做有效吗


在调用的最后是results Pair.create(feedsModelResult,productMap);我想我应该使用zipWith运算符等待所有结果完成,但我不确定如何理解您的流程,但似乎您正在尝试查询一些
FeedsModel
对象,并发出单个
Pair
值,该值将此
FeedsModel
对象与其包含的内部产品对象的一些收集映射打包

问题是,您的
可观察的
是平坦的,可能会乘以每个内部列表,并尝试在到达地图的过程中收集它们,而流仍会将这些项目发送给最终订户

您需要的是一个流,该流获取一个输入
FeedsModel
,将所有项目收集到一个映射,并且只发出一个作为结果映射的项目,然后您可以将该映射与输入
FeedsModel
以及刚刚收集的结果映射配对。
假设您的
feedRepository.fetchFeeds
只能返回单个
FeedsModel
项(您可以使用
single
对其进行细化),那么您将在结束流中得到单个结果

建议使用包含结果选择器的flatMap变体:

feedRepository.fetchFeeds(shopId, langId, skip)
 .flatMap(feedsModel ->
         getProductsMapFromFeedsModelObservable(feedsModel, shopId, langId, currency)
         ,(feedsModel, productsMap) ->
               Pair.create(feedsModel, productsMap)
         );
getProductsMapFromFeedsModelObservable()
是一个
可观察的
,它从输入FeedsModel收集产品到产品映射:

private Observable<HashMap<Integer, ProductModel>> getProductsMapFromFeedsModelObservable(
            FeedsModel feedsModel, int shopId, int langId, int currency) {
        return Observable.fromIterable(feedsModel.getFeed())
                .filter(feed -> feed.getProducts() != null)
                .flatMapIterable(feed -> feed.getProducts())
                .flatMap(productId -> productsRepository.fetchProduct(productId.intValue(), shopId, langId, currency))
                .reduce(new HashMap<Integer, ProductModel>(),
                        (productsMap, productModel) -> {
                            productsMap.put(productModel.getIdProduct(), productModel);
                            return productsMap;
                        })
                .toObservable();
    }
私有可观测getProductsMapFromFeedsModelObservable(
FeedsModel FeedsModel,int shopId,int langId,int currency){
返回Observable.fromIterable(feedsModel.getFeed())
.filter(提要->提要.getProducts()!=null)
.flatMapIterable(提要->提要.getProducts())
.flatMap(productId->productsRepository.fetchProduct(productId.intValue(),shopId,langId,currency))
.reduce(新的HashMap(),
(productsMap,productModel)->{
productsMap.put(productModel.GetIdro