作用

根据Observable发射的每个数据创建一个Observable,然后将这些Observable发射的数据合并到一起放进单个Observable。把每个数据变成一个Observable,可以理解为将一个数据变为一个序列,这样每个数据经过“一对N”的处理再全部收集起来。这其实很像一个平展铺开的操作,所以用”Flat”命名。
image.png
在一些场景下,这个操作符非常有用。例如:当我们得到一个数据集合,集合里每个数据都是Observable。使用这个操作符可以很方便的得到所有Observable发射的完整数据。
所有的Observable在FlatMap在底层用Mearge操作符合并的,所以最后得到的结果可能交叉的。使用ConcatMap就不会出现数据交叉的情况。

示例

注释:代码使用RxJava2,版本号2.2.19。
重载方法太多,选择其中的核心几类进行梳理,其他的都是在核心的基础上的小功能扩展。

  • **flatMap(Function<? super T, ? extends ObservableSource<? extends R>> mapper)**
  • **flatMap(Function<? super T, ? extends ObservableSource<? extends R>> mapper, boolean delayErrors)**

参数mapper:负责根据接收到的内容生成Observable。
参数delayError:为true的时候,如果源Observable和内部的Observable发出的onError通知会被搁置。直到所有的Observable终止才会发送。

  • flatMap( Function onNextMapper,Function onErrorMapper,Callable onCompleteSupplier)(精简了方法中的泛型信息)

参数onNextMapper:负责根据接收到的内容生成Observable。
参数onErrorMapper:负责根据接收到的错误通知生成Observable。
参数onCompleteSuplier:负责处理接收到的完成通知生成Observable。

  1. Observable<Integer> afterFlatMap = fromArray.flatMap(new Function<String, ObservableSource<Integer>>() {
  2. @Override
  3. public ObservableSource<Integer> apply(String s) {
  4. //TODO
  5. return null;
  6. }
  7. });

参考资料

http://reactivex.io/documentation/operators/flatmap.html