Rxjava scan 与reduce区别
scan和reduce都是把操作的观察序列的上一次操作的结果做为第二次的参数传递给第二次Observable使用,但两者有区别:
scan:每次操作之后先把数据输出,然后在调用scan的回调函数进行第二次操作
reduce:把所有的操作都操作完成之后在调用一次观察者,把数据一次性输出
Observable.range(0, 5)
.scan(new Func2<Integer, Integer, Integer>() {
@Override
public Integer call(Integer result, Integer result2) {
System.out.println("result " + result + " result2 " + result2);
return result + result2;
}
})
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
System.out.println("integer " + integer);
}
});
输出的结果:从输出的结果可以看出scan的回调函数和观察者是交互调用
integer 0
result 0 result2 1
integer 1
result 1 result2 2
integer 3
result 3 result2 3
integer 6
result 6 result2 4
integer 10
Reduce:先全部计算完成在调用一次观察者
Observable.range(0, 5)
.reduce(new Func2<Integer, Integer, Integer>() {
@Override
public Integer call(Integer integer, Integer integer2) {
System.out.println("result " + integer + " result2 " + integer2);
return integer + integer2;
}
})
.subscribe(new Action1<Integer>() {
@Override
public void call(Integer integer) {
System.out.println("integer " + integer);
}
});
result 0 result2 1
result 1 result2 2
result 3 result2 3
result 6 result2 4
integer 10
根据测试结果可以看出scan和reduce的区别