Rx_java(5)Rx_java2操作符(Map、Flatmap)介绍-登录并获取用户信息小案例
2018-01-04 15:34
691 查看
相关文章
观察者模式实例讲解使用java中的类(Observable与Observer)实现观察者模式
Rx_java2的基本使用
Rx_java2中的线程控制
Rx_java2操作符介绍2(debounce 、filter 、switchMap )
Rx_java2操作符介绍3(throttleFirst、debounce )
Retrofit结合RxJava2使用
写在前面
Rxjava中有很多操作符,这里不会全部都讲,可以在RxJava中文文档中自己去看所有的操作符。Map操作符
下面是RxJava中文文档中对于Map操作符的介绍。下面以一个简单的例子来说明map操作符:
下面的代码功能就是在Observable中传入一个int类型的数字,通过map操作,转换为String类型。
首先通过just创建一个Observable对象,并且传入一个int类型的数字。
然后通过map来转换,在代码注释中已经写的很明白了。
Observable<String> mapObservable = Observable // 通过just创建Observable对象(还可以通过create/from等创建) .just(1) // function对象中第一个参数为input参数,第二个参数为output参数 .map(new Function<Integer, String>() { @Override public String apply(@NonNull Integer integer) throws Exception { // 4000 通过mapFunction功能方法转化成我们需要类型 return mapFunction(integer); } }); //******执行转换的功能函数 public String mapFunction(Integer integer){ return integer + ""; }
其实map操作符,就是一个转换机器,就想工厂加工火腿肠一样,这头进去的是猪,在转换机器的加工后,那头出来的是火腿肠,而这个转换方法具体的操作,由你自己定。
flatMap操作符
下面先贴出RxJava中文文档中flatMap的部分介绍(请在文档中自己查看全部详细介绍)实例-登陆获取用户信息(flatMap的使用)
首相,我们创建一个UserParam类,里面有俩个参数,就是我们登陆需要的用户名和密码。本Markdown编辑器使用[StackEdit][6]修改而来,用它写博客,将会带来全新的体验哦:
/** * description: * author: dujun * created at: 2018/1/4 14:37 * update: 2018/1/4 * version: */ public class UserParam { public String username; public String password; public UserParam(String username, String password) { this.username = username; this.password = password; } }
然后创建登陆成功json所对应的对象,登陆成功后,服务器返回的json为
{success:200,message:"登录成功",user_id:101}
联网获取json的方法这里仿造一个,就是传入UserParam(里面有用户名和密码)。,然后从网络获取json。
public static String login(UserParam userParam ){ return "{success:1,message:\"登录成功\",user_id:101}"; }
然后把这个json转换为一个对象,所以先创建这个对象的模型为:
/** * description: * author: dujun * created at: 2018/1/4 14:43 * update: 2018/1/4 * version: */ public class BaseResult { public int success; public String message; public int user_id; }
我们现在执行登录代码,全过程为传入用户名和密码(UserParam),返回登录结果信息的对象(BaseResult)
Observable<BaseResult> resultObservable = Observable.just(getUserParam()).flatMap(new Function<UserParam, ObservableSource<BaseResult>>() { @Override public ObservableSource<BaseResult> apply(@NonNull UserParam userParam) throws Exception { // 登录,并返回json登录结果信息 String json = HttpUtils.login(userParam); // 把json数据转化为对象 Gson gson = new Gson(); BaseResult baseResult = gson.fromJson(json, BaseResult.class); return Observable.just(baseResult); } });
此时,我们获取到Observable,直接绑定一个Observer接受BaseResult对象即可,
但是,我们此时只是获取到了登录结果。获取到了user_id,我们还需要通过user_id去获取用户信息。
我们看到在flatMap的apply方法中,返回的是一个ObservableSource对象,也就是说,flatMap又一次返回了一个发射数据的Observable,这也是flatMap和map最大的区别,flapMap可以连续返回发射数据的Observable,
所以我们继续用flatMapcao操作符去获取用户信息
我们看看获取用户信息方法:
/** * * @param userId 用户id * @return 用户信息json */ public static String getUserInfo(int userId){ return "{head_url:\"www\",username:\"对面五只狗\",id:\"101\"}"; }
让后继续创建用户信息模型
/** * description: * author: dujun * created at: 2018/1/4 15:21 * update: 2018/1/4 * version: */ public class User { public String head_url; public String id; public String username; public User(String head_url, String id, String username) { this.head_url = head_url; this.id = id; this.username = username; } }
接下的过程就是传入BaseResult(包含用户id)最后获取到用户信息的模型的过程。
下面代码是一个完整的通过俩个flatMap变化最终获取Obervable的过程。
Observable<User> userObservable = Observable .just(getUserParam()) .flatMap(new Function<UserParam, ObservableSource<BaseResult>>() { @Override public ObservableSource<BaseResult> apply(@NonNull UserParam userParam) throws Exception { // 登录,并返回json登录结果信息 String json = HttpUtils.login(userParam); Gson gson = new Gson(); BaseResult baseResult = gson.fromJson(json, BaseResult.class); return Observable.just(baseResult); } }) // 继续调用flatMap转换 .flatMap(new Function<BaseResult, ObservableSource<User>>() { @Override public ObservableSource<User> apply(@NonNull BaseResult baseResult) throws Exception { // 获取用户信息 String json = HttpUtils.getUserInfo(baseResult.user_id); // 把json转换为User对象的过程 Gson gson = new Gson(); User user = gson.fromJson(json, User.class); // 返回Observable对象,发送User return Observable.just(user); } });
以上过程,进过俩个flatMap操作符的转换,最终的结果返回了一个 Observable对象,然后创建Observer绑定即可
userObservable.subscribe(new Observer<User>() { @Override public void onSubscribe(@NonNull Disposable d) { } @Override public void onNext(@NonNull User user) { // 获取到User实例对象 } @Override public void onError(@NonNull Throwable e) { } @Override public void onComplete() { } });
写在后面
本篇文章中讲解了Rxjava中map和flatMap操作符的使用,下篇将继续讲解操作符,操作符有太多,要想详细了解,请看RxJava中文文档相关文章推荐
- Rx_java(6)Rx_java2操作符(debounce 、filter 、switchMap )介绍-搜索功能小案例
- Rx_java(7)Rx_java2操作符(throttleFirst、debounce )介绍-防止按钮被重复点击案例
- java 微信小程序登录 验证登录并获取用户信息
- java实现微信公众号授权登录获取用户信息流程
- BDF2-JAVA代码以及view页面获取当前登录用户的信息
- java之《ssm》微博登录获取之用户信息
- Java实现--登录和注册案例(把用户信息存进集合)
- 移动端第三方登录(微信)java验证并获取用户信息
- Java 微信登录授权后获取微信用户信息昵称乱码问题解决
- java获取AD域用户信息
- php下获取Discuz论坛登录用户名、用户组、用户ID等信息的实现代码
- oracle获取当前登录用户的所有表,视图,sequence的相关信息
- 解决 CAS + Spring Security整合 无法获取当前登录用户信息
- WebSphere Portal V6.1 获取登录用户信息
- 金蝶EAS登录获取用户相关信息失败!
- 金蝶EAS登录获取用户相关信息失败、EAS默认用户名、密码
- 解决 CAS + Spring Security整合 无法获取当前登录用户信息
- java获取AD域用户信息
- (证实可用)C#获取AD所有的用户信息,比如登录名,邮件名,属于组织,名字
- ABAP获取用户登录详细信息并已邮件附件的形式发送给你