转载请标明出处:http://77blogs.com/?p=183
对 Observable 发射的数据都应用(apply)一个函数,这个函数返回一个 Observable,然后合并这些 Observables,并且发送(emit)合并的结果。
flatMap() 的原理是这样的:
1. 使用传入的事件对象创建一个 Observable 对象
2. 并不发送这个 Observable, 而是将它激活,于是它开始发送事件;
3. 每一个创建出来的 Observable 发送的事件,都被汇入同一个 Observable ,而这个 Observable 负责将这些事件统一交给 Subscriber 的回调方法。这三个步骤,把事件拆成了两级,通过一组新创建的 Observable 将初始的对象『铺平』之后通过统一路径分发了下去。而这个『铺平』就是 flatMap() 所谓的 flat。
flatMap 和 map 操作符很相像,flatMap 发送的是合并后的 Observables,map 操作符发送的是应用函数后返回的结果集。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Observable.just(0, 1, 2).flatMap(new Function<Integer, ObservableSource<Integer>>() { @Override public ObservableSource<Integer> apply(Integer integer) { return createObservable(integer); } }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer<Integer>() { @Override public void accept(Integer integer) { Log.d(TAG, integer + ""); } }, new Consumer<Throwable>() { @Override public void accept(Throwable throwable) { } }); |
createObservable方法如下:
1 2 3 4 5 6 7 8 9 |
private static Observable<Integer> createObservable(final int i) { return Observable.create(new ObservableOnSubscribe<Integer>() { @Override public void subscribe(ObservableEmitter<Integer> emitter) throws Exception { emitter.onNext(i + 1); emitter.onComplete(); } }); } |
打印结果为:
01-02 16:52:36.969 30827-30827/com.status.rxjavasample D/RxJavaHelper: 1
01-02 16:52:36.969 30827-30827/com.status.rxjavasample D/RxJavaHelper: 2
01-02 16:52:36.969 30827-30827/com.status.rxjavasample D/RxJavaHelper: 3