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(); } }); }
Rxjava之flatMap操作符
最新推荐文章于 2022-06-09 15:13:01 发布