RxJava 转换操作符scan

时间:2021-09-13 17:49:06

sacn操作符是遍历源Observable产生的结果,再按照自定义规则进行运算,依次输出每次计算后的结果给订阅者:

call 回掉第一个参数是上次的结算结果,第二个参数是当此的源observable的输入值

例子: 依次做加法

 Observable.range(1, 10).scan(new Func2<Integer, Integer, Integer>() {
            @Override
            public Integer call(Integer sum, Integer integer) {
                return sum + integer;
            }
        }).subscribe(new Observer<Integer>() {
            @Override
            public void onCompleted() {
                LogUtils.d("------>onCompleted()");
            }

            @Override
            public void onError(Throwable e) {
                LogUtils.d("------>onError()" + e);
            }

            @Override
            public void onNext(Integer integer) {
                LogUtils.d("------>onNext()" + integer);
            }
        });

结果:

02-27 03:58:55.630 2997-2997/com.rxandroid.test1 D/----->: ------>onNext()1
02-27 03:58:55.630 2997-2997/com.rxandroid.test1 D/----->: ------>onNext()3
02-27 03:58:55.630 2997-2997/com.rxandroid.test1 D/----->: ------>onNext()6
02-27 03:58:55.630 2997-2997/com.rxandroid.test1 D/----->: ------>onNext()10
02-27 03:58:55.630 2997-2997/com.rxandroid.test1 D/----->: ------>onNext()15
02-27 03:58:55.630 2997-2997/com.rxandroid.test1 D/----->: ------>onNext()21
02-27 03:58:55.630 2997-2997/com.rxandroid.test1 D/----->: ------>onNext()28
02-27 03:58:55.630 2997-2997/com.rxandroid.test1 D/----->: ------>onNext()36
02-27 03:58:55.630 2997-2997/com.rxandroid.test1 D/----->: ------>onNext()45
02-27 03:58:55.630 2997-2997/com.rxandroid.test1 D/----->: ------>onNext()55
02-27 03:58:55.630 2997-2997/com.rxandroid.test1 D/----->: ------>onCompleted()

注意:当执行原Observable输入的第一个时,并不会回掉call函数,也就是说第一次并不参与运算,直接输给订阅者:

 Observable.range(1, 10).scan(new Func2<Integer, Integer, Integer>() {
            @Override
            public Integer call(Integer sum, Integer integer) {
                LogUtils.d("------->sum:" + sum + "   integer:" + integer);
                return sum + integer;
            }
        }).subscribe(new Observer<Integer>() {
            @Override
            public void onCompleted() {
                LogUtils.d("------>onCompleted()");
            }

            @Override
            public void onError(Throwable e) {
                LogUtils.d("------>onError()" + e);
            }

            @Override
            public void onNext(Integer integer) {
                LogUtils.d("------>onNext()" + integer);
            }
        });
RxJava 转换操作符scan