rxjava 六:map事件转换

一:map

 Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
                emitter.onNext(1);
                emitter.onNext(2);
                emitter.onNext(3);
                emitter.onComplete();
            }
        })
                .map(new Function<Integer, Integer>() {   // map 作用:处理转换发送的事件
                    @Override
                    public Integer apply(Integer integer) throws Exception {
                        return integer*10;   //将每个值乘以10
                    }
                })
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        Log.i("zqq","accept>>"+integer);  //输出结果
                    }
                });

结果:
在这里插入图片描述
描述:经过map转换之后,每个结果都乘以10输出
map 参数Function<Integer, Integer> 泛型第一个表示:原数据类型 第二格表示转换后的数据类型

二:FlatMap

  Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
                emitter.onNext(1);
                emitter.onNext(2);
                emitter.onNext(3);
                emitter.onNext(4);
     
                emitter.onComplete();
            }
        })
               .flatMap(new Function<Integer, ObservableSource<String>>() {  // flatMap 作用:将原Observable 转换为 新的 Observable<?>
                   @Override
                   public ObservableSource<String> apply(Integer integer) throws Exception {   // 返回值为新的Observable  Observable<T> implements ObservableSource<T>
                       StringBuilder sb=new StringBuilder();
                       sb.append(integer+" hello");
                       Observable<String> observable = Observable.just(sb.toString());
                       return observable;    
                   }
               })
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(String str) throws Exception {
                        Log.i("zqq","accept>>"+str);
                    }
                });

输出结果:
在这里插入图片描述
源码说明:将转换函数应用于发出的每个项的结果,通过源ObservableSource并合并从中获得的ObservableSource的结果转变
flatmap,不保证原来事件发出的顺序性

三、concatMap

 Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
                emitter.onNext(1);
                emitter.onNext(2);
                emitter.onNext(3);
                emitter.onNext(4);

                emitter.onComplete();
            }
        })
               .concatMap(new Function<Integer, ObservableSource<String>>() {  // flatMap 作用:将原Observable 转换为 新的 Observable<?>
                   @Override
                   public ObservableSource<String> apply(Integer integer) throws Exception {   // 返回值为新的Observable  Observable<T> implements ObservableSource<T>
                       StringBuilder sb=new StringBuilder();
                       sb.append(integer+" hello");
                       Observable<String> observable = Observable.just(sb.toString());
                       return observable;
                   }
               })
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(String str) throws Exception {
                        Log.i("zqq","accept>>"+str);
                    }
                });

输出结果:
在这里插入图片描述
contactMap 与 flatMap 类似,但是contactMap 保证原来事件的顺序性

作用

可以处理现实开发当中一些组合的事件,比如,注册后自动登录;列表多条数据更新后重新获取数据刷新;排序分类或者其他。
以注册后自动登录为例

请求接口

  public interface UserApi{
        @GET("/")   //使用/或者. 来代替无接口
        Observable<ResponseBody> register();

        @GET("/")   //使用/或者. 来代替无接口
        Observable<ResponseBody> login();
    }

请求事件

   //没有接口,随便找个接口测试,是否进行了两次请求
        Gson gson = new GsonBuilder().setLenient().create();
        Retrofit retrofit=new Retrofit.Builder()
                .baseUrl("https://www.tianqiapi.com/")
                .addConverterFactory(GsonConverterFactory.create(gson))
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();

        final UserApi userApi = retrofit.create(UserApi.class);
        userApi.register()
               .subscribeOn(Schedulers.io())        //io线程网络请求
                .observeOn(AndroidSchedulers.mainThread())   //主线程处理结果
                .doOnNext(new Consumer<ResponseBody>() {   //注册请求的结果处理
                    @Override
                    public void accept(ResponseBody responseBody) throws Exception {
                        //注册成功后,处理结果,比如保存用户名
                        Log.i("zqq","注册成功后数据处理");
                    }
                })
                .observeOn(Schedulers.io()) //切换线程,用于登录的线程
                .flatMap(new Function<ResponseBody, ObservableSource<ResponseBody>>() {      //进行转换,去登录
                    @Override
                    public ObservableSource<ResponseBody> apply(ResponseBody responseBody) throws Exception {
                        Log.i("zqq","注册成功后,事件转换,自动登录");
                        return userApi.login();     //此处可判断注册结果是否成功,若失败可直接调用:  Observable.error() ,让登录接收错误处理
                    }
                })
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<ResponseBody>() {
                    @Override
                    public void accept(ResponseBody responseBody) throws Exception {
                        Log.i("zqq","自动登录结果成功");
                    }
                }, new Consumer<Throwable>() {   //错误处理
                    @Override
                    public void accept(Throwable throwable) throws Exception {

                    }
                });

返回结果:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值