RxJava2.0第四篇之 zip、concat 、merge 合并发送器

来来来,说一下事件合并,合二为一,上面的都有合并之意,但也有各的特色之在;

----------------------------------------zip-以小(发射器B)为主-----------------------------------------------

public static  Observable zip(
        ObservableSource source1, ObservableSource source2,
        BiFunction zipper) {
    // ......
    return zipArray(Functions.toFunction(zipper), false, bufferSize(), source1, source2);
}

专用于合并事件(发射器的发射事件),从文档中可以看出,zip操作符可以合并两个发射器,最终合并出结果,且最终结果的数目只和结果集少的那个相同,从图一可知,结果集是以发送时最少的为主输出合并数量

RxJava2.0第四篇之 zip、concat 、merge 合并发送器_第1张图片  

图中可以看出,发射器A中的数据“5”在合并后抛弃了

public static void zip(final TextView textView) {

        //getObservableThere()、getObservableTwo() 为第二篇文章中的工具方法,这一块在本文中省略
        Observable observable = getObservableThere();
        Observable observable2 = getObservableTwo();
        
        Observable.zip(observable, observable2, new BiFunction() {
            @Override
            public JSONObject apply(@NonNull String response, @NonNull String response2) throws Exception {
                //将两个发射器的结果合并在一块
                return new JSONObject().put("one", response).put("two", response2);
            }
        }).subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer() {
                    @Override
                    public void accept(@NonNull JSONObject jsonObject) throws Exception {
                        textView.setText(jsonObject.toString());
                    }
                });
    }

 (图一)    结果输出

 

 

-------------------------------------concat 顺序发出----------------------------------------- 

将两个发射器合并成一个发射器, 依次发送,发送完一个再接着发送第二个
//原始方法
public static  Observable concat(ObservableSource source1, ObservableSource source2) {
    ObjectHelper.requireNonNull(source1, "source1 is null");
    ObjectHelper.requireNonNull(source2, "source2 is null");
    return concatArray(source1, source2);
}

示例代码:     结果会依次输出 

public static void concat(final TextView textView) {
        StringBuffer buffer = new StringBuffer();
        Observable.concat(Observable.just(1, 23, 465), Observable.just(789, 987, 666))
                .subscribe(new Consumer() {
                    @Override
                    public void accept(@NonNull Integer integer) throws Exception {
                        textView.setText(buffer.append(integer + "--->").toString());
                    }
                });
    }

----------------------------------merge-交叉合并---------------------------------------

public static  Observable merge(ObservableSource source1, ObservableSource source2) {
    ObjectHelper.requireNonNull(source1, "source1 is null");
    ObjectHelper.requireNonNull(source2, "source2 is null");
    return fromArray(source1, source2).flatMap((Function)Functions.identity(), false, 2);
}

 用图说明情况

RxJava2.0第四篇之 zip、concat 、merge 合并发送器_第2张图片

合并多个Observables的发射物, Merge 可能会让合并的Observables发射的数据交错,这也就是和concat的较大区别(挨个发送),由上图即可理解,不用等到 发射器 A 发送完所有的事件再进行发射器 B 的发送,他们是可以参杂交互发射事件的

 public static void merge(final TextView textView) {
        Observable.merge(Observable.just(1, 2, 7, 8), Observable.just(3, 4, 5)).subscribe(new Consumer() {
            @Override
            public void accept(@NonNull Integer integer) throws Exception {
                textView.append("merge :" + integer + "\n");
            }
        });
    }

 

 

你可能感兴趣的:(RXJAVA,2.0)