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);
            }
        });
總結
  • 優化了很是多的循環代碼,可讀性,效率都高了不少
  • 其餘的操做符,挖個坑,之後慢慢填
相關文章
相關標籤/搜索