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); } });