## FlatMap
`FlatMap`將一個發射數據的Observable變換為多個Observables,然后將它們發射的數據合并后放進一個單獨的Observable

`FlatMap`操作符使用一個指定的函數對原始Observable發射的每一項數據執行變換操作,這個函數返回一個本身也發射數據的Observable,然后`FlatMap`合并這些Observables發射的數據,最后將合并后的結果當做它自己的數據序列發射。
這個方法是很有用的,例如,當你有一個這樣的Observable:它發射一個數據序列,這些數據本身包含Observable成員或者可以變換為Observable,因此你可以創建一個新的Observable發射這些次級Observable發射的數據的完整集合。
注意:`FlatMap`對這些Observables發射的數據做的是合并(`merge`)操作,因此它們可能是交錯的。
在許多語言特定的實現中,還有一個操作符不會讓變換后的Observables發射的數據交錯,它按照嚴格的順序發射這些數據,這個操作符通常被叫作`ConcatMap`或者類似的名字。

RxJava將這個操作符實現為`flatMap`函數。
注意:如果任何一個通過這個`flatMap`操作產生的單獨的Observable調用`onError`異常終止了,這個Observable自身會立即調用`onError`并終止。
這個操作符有一個接受額外的`int`參數的一個變體。這個參數設置`flatMap`從原來的Observable映射Observables的最大同時訂閱數。當達到這個限制時,它會等待其中一個終止然后再訂閱另一個。
* Javadoc: [flatMap(Func1)](http://reactivex.io/RxJava/javadoc/rx/Observable.html#flatMap(rx.functions.Func1))
* Javadoc: [flatMap(Func1,int)](http://reactivex.io/RxJava/javadoc/rx/Observable.html#flatMap(rx.functions.Func1,%20int))

還有一個版本的`flatMap`為原始Observable的每一項數據和每一個通知創建一個新的Observable(并對數據平坦化)。
它也有一個接受額外`int`參數的變體。
* Javadoc: [flatMap(Func1,Func1,Func0)](http://reactivex.io/RxJava/javadoc/rx/Observable.html#flatMap(rx.functions.Func1,%20rx.functions.Func1,%20rx.functions.Func0))
* Javadoc: [flatMap(Func1,Func1,Func0,int)](http://reactivex.io/RxJava/javadoc/rx/Observable.html#flatMap(rx.functions.Func1,%20rx.functions.Func1,%20rx.functions.Func0,%20int))

還有一個版本的`flatMap`會使用原始Observable的數據觸發的Observable組合這些數據,然后發射這些數據組合。它也有一個接受額外`int`參數的版本。
* Javadoc: [flatMap(Func1,Func2)](http://reactivex.io/RxJava/javadoc/rx/Observable.html#flatMap(rx.functions.Func1,%20rx.functions.Func2))
* Javadoc: [flatMap(Func1,Func2,int)](http://reactivex.io/RxJava/javadoc/rx/Observable.html#flatMap(rx.functions.Func1,%20rx.functions.Func2,%20int))
### flatMapIterable

`flatMapIterable`這個變體成對的打包數據,然后生成Iterable而不是原始數據和生成的Observables,但是處理方式是相同的。
* Javadoc: [flatMapIterable(Func1)](http://reactivex.io/RxJava/javadoc/rx/Observable.html#flatMapIterable(rx.functions.Func1))
* Javadoc: [flatMapIterable(Func1,Func2)](http://reactivex.io/RxJava/javadoc/rx/Observable.html#flatMapIterable(rx.functions.Func1,%20rx.functions.Func2))
### concatMap

還有一個`concatMap`操作符,它類似于最簡單版本的`flatMap`,但是它按次序連接而不是合并那些生成的Observables,然后產生自己的數據序列。
* Javadoc: [concatMap(Func1)](http://reactivex.io/RxJava/javadoc/rx/Observable.html#concatMap(rx.functions.Func1))
### switchMap

RxJava還實現了`switchMap`操作符。它和`flatMap`很像,除了一點:當原始Observable發射一個新的數據(Observable)時,它將取消訂閱并停止監視產生執之前那個數據的Observable,只監視當前這一個。
* Javadoc: [switchMap(Func1)](http://reactivex.io/RxJava/javadoc/rx/Observable.html#switchMap(rx.functions.Func1))
### split

在特殊的`StringObservable`類(默認沒有包含在RxJava中)中還有一個`split`操作符。它將一個發射字符串的Observable轉換為另一個發射字符串的Observable,只不過,后者將原始的數據序列當做一個數據流,使用一個正則表達式邊界分割它們,然后合并發射分割的結果。
- ReactiveX
- Observables
- Single
- Subject
- Scheduler
- Operators
- 創建操作
- Create
- Defer
- Empty/Never/Throw
- From
- Interval
- Just
- Range
- Repeat
- Start
- Timer
- 變換操作
- Buffer
- FlatMap
- GroupBy
- Map
- Scan
- Window
- 過濾操作
- Debounce
- Distinct
- ElementAt
- Filter
- First
- IgnoreElements
- Last
- Sample
- Skip
- SkipLast
- Take
- TakeLast
- 結合操作
- And/Then/When
- CombineLatest
- Join
- Merge
- StartWith
- Switch
- Zip
- 錯誤處理
- Catch
- Retry
- 輔助操作
- Delay
- Do
- Materialize/Dematerialize
- ObserveOn
- Serialize
- Subscribe
- SubscribeOn
- TimeInterval
- Timeout
- Timestamp
- Using
- To
- 條件和布爾操作
- All/Contains/Amb
- DefaultIfEmpty
- SequenceEqual
- SkipUntil/SkipWhile
- TakeUntil/TakeWhile
- 算術和聚合操作
- Average/Concat/Reduce
- Max/Min/Count/Sum
- 異步操作
- 連接操作
- Connect
- Publish
- RefCount
- Replay
- 轉換操作
- 阻塞操作
- 字符串操作
- 按字母順序的操作符列表
- RxJava文檔和教程
- RxJava入門指南
- RxJava使用示例
- 實現自定義操作符
- 自定義插件
- Backpressure
- 錯誤處理
- Android模塊
- 參與開發
- 補充閱讀材料