一、scan(Func2))
连续地对数据序列的每一项应用一个函数,然后连续发射结果
Scan操作符对原始Observable发射的第一项数据应用一个函数,然后将那个函数的结果作为自己的第一项数据发射。它将函数的结果同第二项数据一起填充给这个函数来产生它自己的第二项数据。它持续进行这个过程来产生剩余的数据序列。这个操作符在某些情况下被叫做accumulator。
Observable.just(1,2,3,4,5)
.scan(new Func2<Integer, Integer, Integer>() {
@Override public Integer call(Integer sum, Integer item) {
return sum+item;
}
})
.subscribe(new Action1<Integer>() {
@Override public void call(Integer item) {
Log.d("TAG","scan:"+item);
}
});
使用lambda表达式简化:
Observable.just(1,2,3,4,5)
.scan((sum, item) -> sum+item)
.subscribe(item -> Log.d("TAG","scan:"+item));
运行结果:
scan: 1
scan: 3
scan: 6
scan: 10
scan: 15
二、 scan(R,Func2))
R参数的意思是将其当做一个基值,让后续的值去累加计算。
有一个scan操作符的变体,你可以传递一个种子值给累加器函数的第一次调用(Observable发射的第一项数据)。如果你使用这个版本,scan将发射种子值作为自己的第一项数据。注意:传递null作为种子值与不传递是不同的,null种子值是合法的。
这个操作符默认不在任何特定的调度器上执行。
Observable.just(1,2,3,4,5)
.scan(10,new Func2<Integer, Integer, Integer>() {
@Override public Integer call(Integer sum, Integer item) {
return sum+item;
}
})
.subscribe(new Action1<Integer>() {
@Override public void call(Integer item) {
Log.d("TAG","scan:"+item);
}
});
使用lambda表达式简化:
Observable.just(1,2,3,4,5)
.scan(10, (sum, item) -> sum+item)
.subscribe(item -> Log.d("TAG","scan:"+item));
运行结果:
scan: 11
scan: 13
scan: 16
scan: 20
scan: 25