FlatMap將一個發(fā)射數(shù)據(jù)的Observable變換為多個Observables,然后將它們發(fā)射的數(shù)據(jù)合并后放進一個單獨的Observable
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/flatMap.png" alt="flatMap" />
FlatMap操作符使用一個指定的函數(shù)對原始Observable發(fā)射的每一項數(shù)據(jù)執(zhí)行變換操作,這個函數(shù)返回一個本身也發(fā)射數(shù)據(jù)的Observable,然后FlatMap合并這些Observables發(fā)射的數(shù)據(jù),最后將合并后的結(jié)果當做它自己的數(shù)據(jù)序列發(fā)射。
這個方法是很有用的,例如,當你有一個這樣的Observable:它發(fā)射一個數(shù)據(jù)序列,這些數(shù)據(jù)本身包含Observable成員或者可以變換為Observable,因此你可以創(chuàng)建一個新的Observable發(fā)射這些次級Observable發(fā)射的數(shù)據(jù)的完整集合。
注意:FlatMap對這些Observables發(fā)射的數(shù)據(jù)做的是合并(merge)操作,因此它們可能是交錯的。
在許多語言特定的實現(xiàn)中,還有一個操作符不會讓變換后的Observables發(fā)射的數(shù)據(jù)交錯,它按照嚴格的順序發(fā)射這些數(shù)據(jù),這個操作符通常被叫作ConcatMap或者類似的名字。
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/mergeMap.png" alt="mergeMap" />
RxJava將這個操作符實現(xiàn)為flatMap函數(shù)。
注意:如果任何一個通過這個flatMap操作產(chǎn)生的單獨的Observable調(diào)用onError異常終止了,這個Observable自身會立即調(diào)用onError并終止。
這個操作符有一個接受額外的int參數(shù)的一個變體。這個參數(shù)設(shè)置flatMap從原來的Observable映射Observables的最大同時訂閱數(shù)。當達到這個限制時,它會等待其中一個終止然后再訂閱另一個。
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/mergeMap.nce.png" alt="mergeMap.nce" />
還有一個版本的flatMap為原始Observable的每一項數(shù)據(jù)和每一個通知創(chuàng)建一個新的Observable(并對數(shù)據(jù)平坦化)。
它也有一個接受額外int參數(shù)的變體。
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/mergeMap.r.png" alt="mergeMap.r" />
還有一個版本的flatMap會使用原始Observable的數(shù)據(jù)觸發(fā)的Observable組合這些數(shù)據(jù),然后發(fā)射這些數(shù)據(jù)組合。它也有一個接受額外int參數(shù)的版本。
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/mergeMapIterable.png" alt="mergeMapIterable" />
flatMapIterable這個變體成對的打包數(shù)據(jù),然后生成Iterable而不是原始數(shù)據(jù)和生成的Observables,但是處理方式是相同的。
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/concatMap.png" alt="concatMap" />
還有一個concatMap操作符,它類似于最簡單版本的flatMap,但是它按次序連接而不是合并那些生成的Observables,然后產(chǎn)生自己的數(shù)據(jù)序列。
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/switchMap.png" alt="switchMap" />
RxJava還實現(xiàn)了switchMap操作符。它和flatMap很像,除了一點:當原始Observable發(fā)射一個新的數(shù)據(jù)(Observable)時,它將取消訂閱并停止監(jiān)視產(chǎn)生執(zhí)之前那個數(shù)據(jù)的Observable,只監(jiān)視當前這一個。
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/St.split.png" alt="St.split" />
在特殊的StringObservable類(默認沒有包含在RxJava中)中還有一個split操作符。它將一個發(fā)射字符串的Observable轉(zhuǎn)換為另一個發(fā)射字符串的Observable,只不過,后者將原始的數(shù)據(jù)序列當做一個數(shù)據(jù)流,使用一個正則表達式邊界分割它們,然后合并發(fā)射分割的結(jié)果。