前言:
學習這個操作符之前,請確保你讀過這篇文章: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庫。