Rxjava之flatMap操作符

flatMap是将Observable发射的数据集合变换为Observables集合,然后将这些发射的数据平坦化地放进一个单独的Observable中。
案例一:
先定义一个用户对象,包含用户名和地址,由于地址可能会包含生活,工作等地方,所以使用一个List对象来表示用户的地址。

    public class User {
        public String userName;
        public List<Address> addresses;

    }
    public static class Address {
            public String street;
            public String city;

        }

   我们先使用map来实现一下:
     User user = new User();
     user.addresses = new ArrayList<>();
     Address address1 = new Address();
     address1.street = "联杨路";
     address1.city = "上海";
     Address address2 = new Address();
     address2.street = "虎丘路";
     address2.city = "苏州";
     user.addresses.add(address1);
     user.addresses.add(address2);

     Observable.just(user).map(new Function<User, List<Address>>() {
                   @Override
                   public List<Address> apply(User user) throws Exception {
                           return user.addresses;
                       }
                   }).subscribe(new Consumer<List<Address>>() {
                       @Override
                       public void accept(List<Address> addresses) throws Exception {
                           for (Address address : addresses) {
                               System.out.println(address.street);
                           }

                       }
                   });
    很明显在subscribe方法中使用了for循环遍历嵌套,我们可以去掉嵌套使用flatMap来实现:
    Observable.just(user).flatMap(new Function<User, ObservableSource<Address>>() {
               @Override
               public ObservableSource<Address> apply(User user) throws Exception {
                   return Observable.fromIterable(user.addresses);
               }
           }).subscribe(new Consumer<Address>() {
               @Override
               public void accept(Address address) throws Exception {
                   System.out.println(address.street);

               }
           });
    案例二:
    app项目中经常有这样的需求,就是一个接口请求成功后在接着请求另一个,比如我们需要先获取信用分信息,再获取工具列表,最后贷款产品,
    我们也可以用flatMap实现:
    public void testFlatMap(String message) {
            SignRequest request = getRequest(message, ZYTConstant.CREDIT_SCORE);
            RequestBody requestBody = HttpManager.convertToBody(request);
            //信用分请求
            Flowable<BaseEntity<EntCredit>> flowable = HttpManager.getInstance().getApiService().queryCredit(requestBody);
            flowable.subscribeOn(Schedulers.io())
                    .observeOn(Schedulers.io())
                    .flatMap(new Function<BaseEntity<EntCredit>, Publisher<BaseEntity<RecommendTool>>>() {
                        @Override
                        public Publisher<BaseEntity<RecommendTool>> apply(BaseEntity<EntCredit> entCreditBaseEntity) throws Exception {
                            //获取信用分
                            EntCredit responseData = entCreditBaseEntity.getResponseData();
                            int score = responseData.getResult().getScore();
                            System.out.println(score + "---score---------" + score);
                            String corpId = LoginStatus.getInstance().getCorpId();

                            String aesKey = AESCBCUtils.generateAesKey();
                            String timestamp = Utils.getDateFormat(new Date());
                            HashMap<String, Object> object = new HashMap<>(16);

                            object.put("corpId", corpId);
                            object.put("openStatus", "1");
                            String message = Utils.encryptMessage(aesKey, object);

    //        String signture = Md5Utils.toMD5(message + Md5Utils.SECRET + timestamp).toUpperCase();
                            String signture = Utils.get2Signture(message, timestamp, ZYTConstant.SERVICEID_TOOLS_MY_LIST);
                            String encrypteAeskey = RSAUtils.encrypt(aesKey, RSAUtils.RSA_PUBLIC_KEY);

                            try {
                                message = URLEncoder.encode(message, "utf-8");
                            } catch (UnsupportedEncodingException e) {
                                e.printStackTrace();
                            }

                            QueryToolsStatusRequest params = new QueryToolsStatusRequest(ZYTConstant.SERVICEID_TOOLS_MY_LIST, timestamp
                                    , LoginStatus.getInstance().getLoginToken(), message, signture, encrypteAeskey);
                                    //工具列表
                            Flowable<BaseEntity<RecommendTool>> queryTools = HttpManager.getInstance().getApiService()
                                    .queryUserTool(HttpManager.convertToBody(params));
                            return queryTools;
                        }
                    })
                    .flatMap(new Function<BaseEntity<RecommendTool>, Publisher<BaseEntity<LoanListResp>>>() {
                        @Override
                        public Publisher<BaseEntity<LoanListResp>> apply(BaseEntity<RecommendTool> recommendToolBaseEntity) throws Exception {
                            //获取工具列表
                            List<RecommendTool.Tool> result = recommendToolBaseEntity.getResponseData().getResult();
                            String message1 = MapUtils.getInstance()
                                    .put("channelCode", "1009")
                                    .put("appCode", "SMEAPP")
                                    .put("currentPage", pageNum + "")
                                    .put("pageSize", PAGESIZE)
                                    //.put("productArea", "310104")
                                    .toJsonString();
                            SignRequest signRequest = getRequest(message1, ZYTConstant.LOAN_LIST);
                            //贷款产品列表请求
                            Flowable<BaseEntity<LoanListResp>> flowable1 = HttpManager.getInstance().getApiService().LoanList(HttpManager.convertToBody(signRequest));
                            return flowable1;
                        }
                    }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer<BaseEntity<LoanListResp>>() {
                @Override
                public void accept(BaseEntity<LoanListResp> loanListRespBaseEntity) throws Exception {
                     //获取贷款产品列表
                    List<LoanProBean> result = loanListRespBaseEntity.getResponseData().getResult();

                }
            });


        }






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值