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