RxJava中的scan和reduce的作用比较相近,都是把前一次的计算结果作为参数传入下一次计算中。它们的官方定义分别如下:
scan:
apply a function to each item emitted by an Observable, sequentially,
and emit each successive value
reduce:
apply a function to each item emitted by an Observable, sequentially,
and emit the final value
从定义我们一目了然它们的区别在于下半句:
- scan会将每次计算的结构都发送到下游;
- 而reduce只会将最终结果发送到下游,complete为止不会收到第二次数据
scan
Observable.range(1, 5)
.scan { result: Int, result2: Int ->
println("result $result result2 $result2")
result + result2
}
.subscribe {
println("integer $it")
}
output:
----------
result 1
x 1 y 2
result 3
x 3 y 3
result 6
x 6 y 4
result 10
x 10 y 5
result 15
reduce
Observable.range(1, 5)
.reduce { x: Int, y: Int ->
println("x $x y $y")
x + y
}
.subscribe {
println("result $it")
}
output:
-----------
x 1 y 2
x 3 y 3
x 6 y 4
x 10 y 5
result 15