RxJava操作符总结之变换

RxJava操作符总结之变换

map()

将发射序列的元素转化成另一种元素进行转换。

我们可能会有这种需求,有一个数组存放图片的地址,我们需要加载到图片并设置到对应的imageView,那么,对于发射的元素,有这样一层转化,url - >Bitmap , 那么此时就是用到map()

请暂时忽略线程的问题,只是为了说明问题

   Observable.from(urls)
                .map(new Func1<String, Bitmap>() {
                    @Override
                    public Bitmap call(String url) {
                        return loadBitmap(url);
                    }
                })
                .subscribe(new Action1<Bitmap>() {
                    @Override
                    public void call(Bitmap bitmap) {
                        //设置图片     
                    }
                });

此代码的逻辑,我们通过from()加载urls数组。通过map()将url转化为Bitmap,最后订阅的时候,设置图片即可。

flatMap()

将发射序列中的元素转化为另一个发射序列,最后将所有的发射序列合并成一条发射序列之后重新发送。

  • flatMap()是将一个元素转化为一个发射序列。 一个元素转化成多个元素。同时,由于其发送的是一个Observable对象,相当于是另一个订阅响应的关系。
  • map() 是将一个元素转化为另一个元素。一个元素转化成另一个元素。同步的直接返回值。

对于上一个例子,我们看到,将图片加载成Bitmap对象,是同步的,但在实际情况中,我们肯定是在异步加载我们的图片,当图片完成之后,我们来通知相应的事件。那么,也即是一个Observable对象

 Observable.from(urls)
                .flatMap(new Func1<String, Observable<Bitmap>>() {
                    @Override
                    public Observable<Bitmap> call(String url) {
                        //返回Observable对象
                        return loadAsyncBitmap(url) ;
                    }
                })
                .subscribe(new Action1<Bitmap>() {
                    @Override
                    public void call(Bitmap bitmap) {
                        //获取到加载的图片
                    }
                });

以上是从逻辑上分析,但从代码角度,我个人认为是因为他们处理的方式不同。因为如果我们直接使用map()时,返回的对像,直接向下发送即可。而对于flatMap(),返回的Observable对象,我们知道其实质是一个携带回调信息的对象,我们不能直接继续发送,而是让其返回值与之前的值绑定。如果有疑惑的,可以看我之前的博客 RxJava前奏之原理分析。相信会有助于理解

上面那个例子是针对flatMap()的一个特性,我们通过flatMap()返回的是一个Observable对象,我们知道其实质可以包含一个发射序列,只不过我们上一个例子的发射序列中只有一个元素,下面表示一个元素转化为一个发射序列。


    public static void main(String[] 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值