連續(xù)地對數(shù)據(jù)序列的每一項應(yīng)用一個函數(shù),然后連續(xù)發(fā)射結(jié)果
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/scan.c.png" alt="scan" />
Scan
操作符對原始Observable發(fā)射的第一項數(shù)據(jù)應(yīng)用一個函數(shù),然后將那個函數(shù)的結(jié)果作為自己的第一項數(shù)據(jù)發(fā)射。它將函數(shù)的結(jié)果同第二項數(shù)據(jù)一起填充給這個函數(shù)來產(chǎn)生它自己的第二項數(shù)據(jù)。它持續(xù)進(jìn)行這個過程來產(chǎn)生剩余的數(shù)據(jù)序列。這個操作符在某些情況下被叫做accumulator
。
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/scan.png" alt="scan" />
RxJava實現(xiàn)了scan
操作符。
示例代碼:
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 Subscriber<Integer>() {
@Override
public void onNext(Integer item) {
System.out.println("Next: " + item);
}
@Override
public void onError(Throwable error) {
System.err.println("Error: " + error.getMessage());
}
@Override
public void onCompleted() {
System.out.println("Sequence complete.");
}
});
輸出
Next: 1
Next: 3
Next: 6
Next: 10
Next: 15
Sequence complete.
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/scanSeed.png" alt="scanSeed" />
有一個scan
操作符的變體,你可以傳遞一個種子值給累加器函數(shù)的第一次調(diào)用(Observable發(fā)射的第一項數(shù)據(jù))。如果你使用這個版本,scan
將發(fā)射種子值作為自己的第一項數(shù)據(jù)。注意:傳遞null
作為種子值與不傳遞是不同的,null
種子值是合法的。
這個操作符默認(rèn)不在任何特定的調(diào)度器上執(zhí)行。