Rx系列<第十五篇>:RxJava之组合/合并操作符

(1)concat和concatArray

组合多个被观察者一起发送数据,合并后 按发送顺序串行执行

    List> list = new ArrayList<>();
    list.add(Observable.just(1,2));
    list.add(Observable.just(3, 4));
    list.add(Observable.just(5, 6));
    Observable.concat(list)
    .subscribe(new Consumer() {
        @Override
        public void accept(Integer integer) throws Exception {
            Log.d("aaa", String.valueOf(integer));
        }
    });


    Observable.concatArray(Observable.just(1, 2), Observable.just(3, 4), Observable.just(5, 6))
    .subscribe(new Consumer() {
        @Override
        public void accept(Integer integer) throws Exception {
            Log.d("aaa", String.valueOf(integer));
        }
    });

以上两种方式的合并,返回结果是:1 2 3 4 5 6

(2)merge和mergeArray

组合多个被观察者一起发送数据,合并后 按时间线并行执行

    List> list = new ArrayList<>();
    list.add(Observable.just(1, 2).delay(2000, TimeUnit.MILLISECONDS));
    list.add(Observable.just(3, 4));
    list.add(Observable.just(5, 6));
    list.add(Observable.just(7, 8));
    Observable
            .merge(list)
            .subscribe(new Consumer() {
                @Override
                public void accept(Integer integer) throws Exception {
                    Log.d("aaa", String.valueOf(integer));
                }
            });


    Observable
            .mergeArray(Observable.just(1, 2).delay(2000, TimeUnit.MILLISECONDS), Observable.just(3, 4), Observable.just(5, 6), Observable.just(7, 8))
            .subscribe(new Consumer() {
                @Override
                public void accept(Integer integer) throws Exception {
                    Log.d("aaa", String.valueOf(integer));
                }
            });

以上两种方法的返回结果是:3 4 5 6 7 8 1 2

(3)concatDelayError和mergeDelayError

concatDelayError:多个Observable合并,并按顺序发射数据, 如果发生异常,则不会立即中断发射数据,异常将延迟发射。
mergeDelayError:多个Observable合并,并行发射数据, 如果发生异常,则不会立即中断发射数据,异常将延迟发射。

    List> list = new ArrayList<>();
    list.add(Observable.create(new ObservableOnSubscribe() {
        @Override
        public void subscribe(ObservableEmitter e) throws Exception {
            e.onNext(1);
            e.onNext(2);
            e.onError(new NullPointerException("exception"));
            e.onComplete();
        }
    }).delay(2000, TimeUnit.MILLISECONDS));

    list.add(Observable.create(new ObservableOnSubscribe() {
        @Override
        public void subscribe(ObservableEmitter e) throws Exception {
            e.onNext(3);
            e.onNext(4);
            e.onError(new NullPointerException("exception"));
            e.onComplete();
        }
    }));

    list.add(Observable.create(new ObservableOnSubscribe() {
        @Override
        public void subscribe(ObservableEmitter e) throws Exception {
            e.onNext(5);
            e.onNext(6);
            e.onError(new NullPointerException("exception"));
            e.onComplete();
        }
    }));

    Observable
            .concatDelayError(list)
            .subscribe(new Consumer() {
        @Override
        public void accept(Integer integer) throws Exception {
            Log.d("aaa", String.valueOf(integer));
        }
    }, new Consumer() {
        @Override
        public void accept(Throwable throwable) throws Exception {
            Log.d("aaa", "发生了异常");
        }
    });

返回结果是:

Rx系列<第十五篇>:RxJava之组合/合并操作符_第1张图片
图片.png
(4)zip

合并多个被观察者的数据流, 然后发送(Emit)最终合并的数据。(数据和数据之间是一对一的关系)

    Observable observable1=Observable.create(new ObservableOnSubscribe() {
        @Override
        public void subscribe(ObservableEmitter e) throws Exception {
            e.onNext(1);
            SystemClock.sleep(1000);
            e.onNext(2);
            SystemClock.sleep(1000);
            e.onNext(3);
            SystemClock.sleep(1000);
            e.onNext(4);
            SystemClock.sleep(1000);
            e.onComplete();
        }
    }).subscribeOn(Schedulers.io());

    Observable observable2=Observable.create(new ObservableOnSubscribe() {
        @Override
        public void subscribe(ObservableEmitter e) throws Exception {
            e.onNext("A");
            SystemClock.sleep(1000);
            e.onNext("B");
            SystemClock.sleep(1000);
            e.onNext("C");
            SystemClock.sleep(1000);
            e.onComplete();
        }
    }).subscribeOn(Schedulers.io());

    Observable.zip(observable1, observable2, new BiFunction() {
        @Override
        public String apply(Integer a,String b) throws Exception {
            return a+b;
        }
    }).subscribe(new Consumer() {
        @Override
        public void accept(String s) throws Exception {
            Log.d("aaa", s);
        }
    });

返回结果:

图片.png
(5)combineLatest

按照同一时间线来进行合并。

    Observable observable1=Observable.create(new ObservableOnSubscribe() {
        @Override
        public void subscribe(ObservableEmitter e) throws Exception {
            SystemClock.sleep(700);
            e.onNext(1);
            SystemClock.sleep(700);
            e.onNext(2);
            SystemClock.sleep(700);
            e.onNext(3);
            SystemClock.sleep(700);
            e.onNext(4);
            SystemClock.sleep(700);
            e.onComplete();
        }
    }).subscribeOn(Schedulers.io());

    Observable observable2=Observable.create(new ObservableOnSubscribe() {
        @Override
        public void subscribe(ObservableEmitter e) throws Exception {
            e.onNext("A");
            SystemClock.sleep(600);
            e.onNext("B");
            SystemClock.sleep(600);
            e.onNext("C");
            SystemClock.sleep(600);
            e.onComplete();
        }
    }).subscribeOn(Schedulers.io());

    Observable.combineLatest(observable1, observable2, new BiFunction() {
        @Override
        public String apply(Integer a,String b) throws Exception {
            return a+b;
        }
    }).subscribe(new Consumer() {
        @Override
        public void accept(String s) throws Exception {
            Log.d("aaa", s);
        }
    });

接下来,根据代码,我们来画一张图。

画两个时间线observable1和observable2,根据代码中指定的时间画时间线,最后观察两个被观察者时间线重合的地方。

Rx系列<第十五篇>:RxJava之组合/合并操作符_第2张图片
图片.png

实际上代码输出的结果也是:

Rx系列<第十五篇>:RxJava之组合/合并操作符_第3张图片
图片.png
(6)combineLatestDelayError

作用类似于concatDelayError() / mergeDelayError() ,即错误处理,上面已经介绍过类似的了。

(7)reduce

把被观察者需要发送的事件聚合成1个事件 & 发送

    Observable.just(1,2,3,4,5)
            .reduce(new BiFunction() {
                @Override
                public Integer apply(Integer integer, Integer integer2) throws Exception {
                    return integer + integer2;
                }
            })
            .subscribe(new Consumer() {
                @Override
                public void accept(Integer integer) throws Exception {
                    Log.d("aaa", String.valueOf(integer));
                }
            });

日志如下:

图片.png

相当于做了一个这样的计算1+2+3+4+5 = 15,再将15发射出去。

(8)collect

将被观察者Observable发送的数据事件收集到一个数据结构里

    Observable
            .just(1, 2, 3, 4, 5, 6)
            .collect(new Callable>() {

                @Override
                public ArrayList call() throws Exception {
                    return new ArrayList();
                }
            }, new BiConsumer, Integer>() {
                @Override
                public void accept(ArrayList list, Integer integer) throws Exception {
                    list.add(integer);
                }
            }).subscribe(new Consumer>() {
        @Override
        public void accept(ArrayList list) throws Exception {
            for (int result : list){
                Log.d("aaa", String.valueOf(result));
            }
        }
    });

执行结果:

Rx系列<第十五篇>:RxJava之组合/合并操作符_第4张图片
图片.png
(9)startWith和startWithArray

startWith: 在已有数据流之前追加一个或一组数据流。

图片.png

startWith可以传递的参数是:一个数据,一个数据列表,一个Observable。

    Observable.just(1, 2, 3)
            .startWith(4)
            .subscribe(new Consumer() {
                @Override
                public void accept(Integer integer) throws Exception {
                    Log.d("aaa", String.valueOf(integer));
                }
            });

返回结果: 4 1 2 3

startWithArray:在已有数据流之前追加一组数据流。

图片.png
    Observable.just(1, 2, 3)
            .startWithArray(4, 5)
            .subscribe(new Consumer() {
                @Override
                public void accept(Integer integer) throws Exception {
                    Log.d("aaa", String.valueOf(integer));
                }
            });

返回结果:4 5 1 2 3

(10)count

统计被观察者发送事件的数量

    Observable.just(1, 2, 3, 4)
            .count()
            .subscribe(new Consumer() {
                @Override
                public void accept(Long aLong) throws Exception {
                    Log.d("aaa", String.valueOf(aLong));
                }
            });

返回结果:4

你可能感兴趣的:(Rx系列<第十五篇>:RxJava之组合/合并操作符)