RxJava学习笔记(三)

Map与FlatMap

map

  • 基础概念

    map 是 RxJava中 最常见的变换操作符之一。

    它的作用就是对 Observable 发送的每一个事件应用一个函数, 使得每一个事件都按照指定的函数去变化。

    通俗的说,就是把被观察者发送事件里面的对象转换成你需要的对象,然后发送给观察者

  • 看图识字

map把 Observable 里的圆形一个个转换成方形,然后发射出去给 observer

RxJava学习笔记(三)_第1张图片
map
  • 代码示例

    比如说现在我需要把一个图片连接下载到bitmap对象然后设置图片

    mObservable.map(new Func1() {
                @Override
                public Bitmap call(String url) {
                    return getBitmapFormUrl(url);
                }
            }).subscribe(new Action1() {
                @Override
                public void call(Bitmap bitmap) { // 参数类型 Bitmap
                    imageView.setImageBitmap(bitmap);
                }
            });
    //Func1方法里,第一个泛型是接受转换的数据类型,第二个参数是转换后的数据类型
    

flatMap

  • 基础概念

FlatMap 将一个发送事件的上游 Observable 变换为多个发送事件的 Observables ,然后将它们发射的事件合并后放进一个单独的 Observable 里

  • 看图识字

    Observable 发送了3个事件,分别是圆形的1、2、3

    flatMap 将3个圆形事件转换成发送三角形和正方形的事件,生成一个新的 Observable

RxJava学习笔记(三)_第2张图片
flatmap

动作分解

RxJava学习笔记(三)_第3张图片
flatmap

  • 代码示例

    现在我们有一个需求,用户需要先请求一个接口获得 token ,然后根据 token 再请求数据获取 user 信息,让我们用示例代码试试吧。

    //TODO 1.声明一个获取token的观察者
     Observable getTokenObservable = .....;
    
    

//TODO 2.将获取token的观察者转换成获取user的观察者
Observable getUserObservable = getTokenObservable.flatMap(new Func1>() {
@Override
public Observable call(String token) {
return getUserObservable(token);//这里有一个获取UserObservable的方法
}
});

//TODO 3.观察者订阅获取user的被观察者
getUserObservable.subscribe(new Action1() {
@Override
public void call(User user) {
//成功拿到user
}
});

//动作合并,更优雅的写法
getTokenObservable.flatMap(new Func1>() {
            @Override
            public Observable call(String token) {
                return getUserObservable(token);
            }
        }).subscribe(new Action1() {
            @Override
            public void call(User userAdapter) {
                //成功拿到user
            }
        });
```
  • 特别声明

    flatMap 并不保证事件的顺序,就是说上面的图刚开始发送123转换后,观察者接收到的可能就是213了。如果需要保证事件顺序可以使用 concatMap

你可能感兴趣的:(RxJava学习笔记(三))