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库。

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