Android进阶学习RxJava(四)map和flatMap等操做符使用从入门到精通

先介绍map概念

  • 官方文档
  • transform the items emitted by an Observable by applying a function to each item.java

    • 经过对每一个项应用一个函数来转换可观察对象发出的项。(百度翻译)
  • 我的理解: Observable 到 Observer 之间传递的数据转换
  • 重点: Transformation

简单的试试怎么用

  • 假设古代钱币加工是先作成圆形
  • 下一步是在圆形中打一个方孔
  • 因此流程应该是这样app

    • 圆形金属-> map(打方孔) -> 钱币
开始撸码
  • 先来最基础的发圆形钱币
Observable.just(new circleMoney(), new circleMoney())
        .subscribe(new Action1<circleMoney>() {
            @Override
            public void call(circleMoney money) {
                money.SayInfo();
            }
        });
  • 而后使用map转换成发方钱币
//先定义个钱币接口
public interface SquareMoney {
    void SayInfo(); //打印型号
    void SetInfo(String info); //设置型号
}
//而后使用map改形成发方钱币
Observable.just(new circleMoney(), new circleMoney())
        .map(new Func1<circleMoney, SquareMoney>() {
            @Override
            public SquareMoney call(circleMoney circleMoney) {
                //类型转换,向上转换为方形钱币
                SquareMoney circleMoney1 = (SquareMoney) circleMoney;
                //设置封装信息为方形
                circleMoney1.SetInfo("SquareMoney");
                return circleMoney1;
            }
        })
        .subscribe(new Action1<SquareMoney>() {
            @Override
            public void call(SquareMoney money) {
                //打印最终封装信息
                money.SayInfo();
            }
        });

总结

  • map能够进行简单的类型转换,对于小型操做很是合适
  • 重点是学习思惟,map一系列的操做符用来对数据进行操做
相似的操做符还有
  • flatMap 扁平化处理数据
  • concatMap 顺序化处理数据
  • filter:集合进行过滤
  • each:遍历集合
  • take:取出集合中的前几个
  • skip:跳过前几个元素

先介绍flatMap概念

  • flat是扁平的意思
官方解释
  • flatMap使用一个指定的函数对原始Observable发射的每一项数据之行相应的变换操做,这个函数返回一个自己也发射数据的Observable,而后FlatMap合并这些Observables发射的数据,最后将合并后的结果当作它本身的数据序列发射。
  • 这个方法是颇有用的,例如,当你有一个这样的Observable:它发射一个数据序列,这些数据自己包含Observable成员或者能够变换为Observable,所以你能够建立一个新的Observable发射这些次级Observable发射的数据的完整集合。
我的理解
  • flatMap将一个发射数据的Observable变换为多个Observables,而后将它们发射的数据合并后放进一个单独的Observable。
  • 适用于大集合里还有小集合,形成多个复杂嵌套等灾难代码,
  • 避免循环嵌套,优化代码结构使用
开始撸码
  • 不知道各位有没有玩过套娃,一个大的里面有好几个小娃娃的那种玩具
  • 假设有N个大点的套娃

avatar

  • 每一个套娃里有N个小套娃
  • 输出每一个大套娃里面的小套娃信息
//小套娃
class SmallMatryoshka {
    private String name = "小套娃";//名字
}
//大套娃
class BigMatryoshka {
    private String name = "大套娃";//名字
    private List<SmallMatryoshka> smallMatryoshkaList;//包含小套娃的列表
}
//先建立一堆小套娃,放到List中
ArrayList<SmallMatryoshka> smallMatryoshkas = new ArrayList<>();
smallMatryoshkas.add(new SmallMatryoshka());
smallMatryoshkas.add(new SmallMatryoshka());
smallMatryoshkas.add(new SmallMatryoshka());
// 建立大套娃,并将小套娃列表放到大套娃中
BigMatryoshka bigMatryoshka = new BigMatryoshka();
bigMatryoshka.smallMatryoshkaList = smallMatryoshkas;
//大套娃列表,把大套娃放进去
List<BigMatryoshka> bigMatryoshkas = new ArrayList<BigMatryoshka>();
bigMatryoshkas.add(bigMatryoshka);
bigMatryoshkas.add(bigMatryoshka);
bigMatryoshkas.add(bigMatryoshka);
//输出大套娃列表里,大套娃包含的全部的小套娃
Observable.from(bigMatryoshkas)
        .flatMap(new Func1<BigMatryoshka, Observable<SmallMatryoshka>>() {
            @Override
            public Observable<SmallMatryoshka> call(BigMatryoshka bigMatryoshka1) {
                //转换成Observable后再次发送
                return Observable.from(bigMatryoshka1.smallMatryoshkaList);
            }
        })
        .subscribe(new Action1<SmallMatryoshka>() {
            @Override
            public void call(SmallMatryoshka smallMatryoshka) {
                //打印套娃名称
                LogUtils.e(smallMatryoshka.name);
            }
        });
总结
  • 优化了很是多的循环代码,可读性,效率都高了不少
  • 其余的操做符,挖个坑,之后慢慢填
相关文章
相关标签/搜索