深入浅出RxJava(操作符)

flatMap和map还是有共同点的,都是将一个对象转换为另一个对象,不同的是map只是一对一的转换,而flatMap可以是一对多的转换
http://www.jianshu.com/p/b39afa92807e

http://www.jianshu.com/p/5e93c9101dc5

http://blog.csdn.net/job_hesc/article/details/46495281

http://gank.io/post/560e15be2dca930e00da1083

1、flatMap

    ArrayList list=new ArrayList<>();
    String[] words1={"Hello,","I am","China!"};
    String[] words2={"Hello,","I am","Beijing!"};
    list.add(words1);
    list.add(words2);
    
    Observable.fromIterable(list)
            .flatMap(new Function>() {
                @Override
                public ObservableSource apply(@NonNull String[] strings) throws Exception {
                    return Observable.fromArray(strings);
                }
            })
            .subscribe(new Observer() {
                 private int i;
                 private Disposable mDisposable;

                @Override
                public void onSubscribe(@NonNull Disposable d) {
                      mDisposable = d;
                }

                @Override
                public void onNext(@NonNull String s) {
                    Log.e("---->", s);
                    i++;
                    if (i == 2) {
                        // 在RxJava 2.x 中,新增的Disposable可以做到切断的操作,让Observer观察者不再接收上游事件
                        mDisposable.dispose();
                    }
                }

                @Override
                public void onError(@NonNull Throwable e) {

                }

                @Override
                public void onComplete() {

                }
            });

2、map

        Observable.just("Hello,I am China!")
              // just,就是一个简单的发射器依次调用 onNext() 方法。
             //这个第一个泛型为接收参数的数据类型,第二个泛型为转换后要发射的数据类型
            .map(new Function() {
                @Override
                public String apply(@NonNull String s) throws Exception {
                    return s + "Hello world";
                }
            })
            .subscribe(new Observer() {
                @Override
                public void onSubscribe(@NonNull Disposable d) {

                }

                @Override
                public void onNext(@NonNull String s) {
                    Log.e("---->", s);
                }

                @Override
                public void onError(@NonNull Throwable e) {

                }

                @Override
                public void onComplete() {

                }
            });

3、zip
zip 专用于合并事件,该合并不是连接(连接操作符后面会说),而是两两配对,也就意味着,最终配对出的 Observable 发射事件数目只和少的那个相同。

    Observable.zip(getStringObservable(), getIntegerObservable(), new BiFunction() {
        @Override
        public String apply(@NonNull String s, @NonNull Integer integer) throws Exception {
            return null;
        }
    }).subscribe(new Consumer() {
        @Override
        public void accept(String s) throws Exception {
            Log.e(TAG, "zip : accept : " + s + "\n");
        }
    });

private Observable getStringObservable() {
    return Observable.create(new ObservableOnSubscribe() {
        @Override
        public void subscribe(@NonNull ObservableEmitter e) throws Exception {
            if (!e.isDisposed()) {
                e.onNext("A");

                Log.e(TAG, "String emit : A \n");
                e.onNext("B");

                Log.e(TAG, "String emit : B \n");
                e.onNext("C");

                Log.e(TAG, "String emit : C \n");
            }
        }
    });
}

private Observable getIntegerObservable() {
    return Observable.create(new ObservableOnSubscribe() {
        @Override
        public void subscribe(@NonNull ObservableEmitter e) throws Exception {
            if (!e.isDisposed()) {
                e.onNext(1);

                Log.e(TAG, "Integer emit : 1 \n");
                e.onNext(2);

                Log.e(TAG, "Integer emit : 2 \n");
                e.onNext(3);

                Log.e(TAG, "Integer emit : 3 \n");
                e.onNext(4);

                Log.e(TAG, "Integer emit : 4 \n");
                e.onNext(5);

                Log.e(TAG, "Integer emit : 5 \n");
            }
        }
    });
}

4、基本用法

    //创建被观察者
    Observable observable = Observable.create(new ObservableOnSubscribe() {
        @Override
        public void subscribe(@NonNull ObservableEmitter e) throws Exception {
            e.onNext(1);
            e.onNext(2);
            e.onNext(3);
            e.onComplete();

        }
    });

    //创建观察者
    Observer observer = new Observer() {
        @Override
        public void onSubscribe(Disposable d) {
            Log.e("---->", "subscribe");
            Log.e("---->", Thread.currentThread().getName());
            Log.e("---->", "d");

        }

        @Override
        public void onNext(final Integer value) {
            Log.e("---->", "" + value);
            Log.e("---->", Thread.currentThread().getName());
            textView.setText(value + "");


        }

        @Override
        public void onError(Throwable e) {
            Log.e("---->", "error");
        }

        @Override
        public void onComplete() {
            Log.e("---->", "complete");
        }
    };


    //订阅
    observable.observeOn(AndroidSchedulers.mainThread())// 指定 Subscriber 的回调发生在主线程
            .subscribeOn(Schedulers.io())// 指定 subscribe() 发生在 IO 线程
            .subscribe(observer);

5、Concat

    Observable.concat(Observable.just(1, 2, 4), Observable.just("r", "a", "C", "das"))
            .subscribe(new Consumer() {
                @Override
                public void accept(Serializable serializable) throws Exception {
                    Log.e("--->", serializable.toString());
                }
            });

7、from操作符对id数组进行循环,然后把每个id作为参数再去请求内容,再调用toList把循环请求下来的内容生成一个List。

8、switchMap操作符
switchMap操作符与flatMap操作符类似,都是把Observable产生的结果转换成多个Observable,然后把这多个Observable“扁平化”成一个Observable,并依次提交产生的结果给订阅者。

你可能感兴趣的:(深入浅出RxJava(操作符))