简单操作符链式调用的实质
2020-03-29 本文已影响0人
ivotai
流处理
Observable.range(1,5)
.map { it*2 }
.filter { it>5 }
.subscribe { println(it) }
6
8
10
为什么能做到这样的流处理呢?
原理分析
用 O 代表 Observable,M 代表 map,F 代表 filter,-> 代表 subscribe,A 代表 Observer。
则链式调用:
O.M.F -> A
第一步:转化成 Observable
F(M(O)) -> A , 这里的 M 代表 ObservableMap。
第二步:转化成 Observer
O -> M(F(A)),这里的 M 代表 MapObserver。
现在是不是和操作符的顺序一样了。
具体分析
O -> M ,会调用 M.onNext 方法。
M.onNext 方法会执行 mapper 变化,然后调用 F.onNext 方法。
F.onNext 方法会过滤一部分数据,然后调用 A.onNext 方法。
(这里只分析了 onNext 方法,实际上要等所有 onSubscribe 方法都走完,才轮到 onNext 方法。)
简单操作符是指?
比如 map 就是简单操作符,flatMap 就是复杂操作符。
结论
简单操作符链式调用的实质是,最后会形成与操作符顺序相同的 Observer 集合体,
然后从外层向内层传递数据流。