RxJava2 轉換操作符之Scan()

前言:
學習這個操作符之前,請確保你讀過這篇文章:RxJava2 轉換操作符之FlatMap()方法,或者已經充分了解FlatMap()。因爲這個方法,也是基於FlatMap的。

一、Scan操作流程圖

這裏寫圖片描述

這個流程圖,一目瞭然… 完全不需要任何解釋… 如果看不懂,就先去看一下這篇:RxJava2 轉換操作符之FlatMap()方法。但無論如何,我會用代碼,演示一番:

二、不帶初始值

    public static void actionScan() {

        // Scan() without initialValue parameter.
        Observable.just(1,2,3,4).scan(new BiFunction<Integer, Integer, Integer>() {
            @Override
            public Integer apply(Integer integer, Integer integer2) throws Exception {
                log("apply="+integer+","+integer2);
                return integer*integer2;
            }
        }).subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                log("accept="+integer);
            }
        });
  }

這是輸出結果:

D/TransformingOperations: accept=1
D/TransformingOperations: apply=1,2
D/TransformingOperations: accept=2
D/TransformingOperations: apply=2,3
D/TransformingOperations: accept=6
D/TransformingOperations: apply=6,4
D/TransformingOperations: accept=24

從代碼示例和輸出結果,可以看出。Scan操作符,其實是充當一個累加器的功能。它會先將,第一個item的值,做爲結果,返回給Consumer。然後,再執行apply()方法。同時,以第一條item做爲第一個參數,並以上一個返回給Consumer的值做爲第二個參數。

但是,問題來了,這裏的起始值,是以第一條數據的值,作爲結果返回給Consumer。如果我想額外搞一個值,做爲起始值,不拿第一條數據的值,那該怎麼辦?很簡單,RxJava2,爲Scan方法,提供了一個帶有一個初始值參數的重載方法,廢話不多說,直接看代碼。

二、帶初始值

    public static void actionScan() {

        // Scan() with initialValue as it's first parameter.
        Observable.just(1, 2, 3, 4).scan(5, new BiFunction<Integer, Integer, Integer>() {
            @Override
            public Integer apply(Integer integer, Integer integer2) throws Exception {
                log("apply=" + integer + "," + integer2);
                return integer * integer2;
            }
        }).subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                log("accept=" + integer);
            }
        });

    }

這是輸出結果:

D/TransformingOperations: accept=5
D/TransformingOperations: apply=5,1
D/TransformingOperations: accept=5
D/TransformingOperations: apply=5,2
D/TransformingOperations: accept=10
D/TransformingOperations: apply=10,3
D/TransformingOperations: accept=30
D/TransformingOperations: apply=30,4
D/TransformingOperations: accept=120

通過代碼和輸出結果,可以一目瞭然。帶兩參的Scan()方法的第一個參數就是做爲初始值設定的。帶單個參數的Scan()方法的初始值,是以第一個item爲默認值。


到此爲止,Scan操作符的講解,已經全部說完了。如果,你還有什麼疑惑不解,可以在評論區指出。

附上可以跑的代碼(0 warnings, 0 errors):
https://github.com/SuperBeagleDog/OkMVP

注意:
這個庫裏面有很多東西,RxJava2的轉換操作符部分的demo位於:com.lyf.okmvp.demo.rxjava2包下的TransformingOperations類裏面。

用法:
1、直接在com.lyf.okmvp.ui包下的MainActivity類裏的onCreate()方法裏面,直接調用:

TransformingOperations.actionScan(); // 靜態方法。

2、也可以複製TransformingOperations類到你的項目裏,去爲所欲爲。但前提時,你得有配置過RxJava和RxAndroid。配置方法,自行百度,或參考我的OkMVP庫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章