乐趣区

关于java:Android进阶学习RxJava四map和flatMap等操作符使用从入门到精通

先介绍 map 概念

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

    • 通过对每个项利用一个函数来转换可察看对象收回的项。(百度翻译)
  • 集体了解: Observable 到 Observer 之间传递的数据转换
  • 重点: Transformation

简略的试试怎么用

  • 假如现代钱币加工是先做成圆形
  • 下一步是在圆形中打一个方孔
  • 所以流程应该是这样

    • 圆形金属 -> 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 个大点的套娃

  • 每个套娃里有 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);
            }
        });
总结
  • 优化了十分多的循环代码,可读性,效率都高了很多
  • 其余的操作符,挖个坑,当前缓缓填
退出移动版