前言:
学习这个操作符之前,请确保你读过这篇文章: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库。