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

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

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

public static <T1, T2, R> Observable<R> zip(
        ObservableSource<? extends T1> source1, ObservableSource<? extends T2> source2,
        BiFunction<? super T1, ? super T2, ? extends R> zipper) {
    // ......
    return zipArray(Functions.toFunction(zipper), false, bufferSize(), source1, source2);
}

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

  

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

public static void zip(final TextView textView) {

        //getObservableThere()、getObservableTwo() 为第二篇文章中的工具方法,这一块在本文中省略
        Observable<String> observable = getObservableThere();
        Observable<String> observable2 = getObservableTwo();
        
        Observable.zip(observable, observable2, new BiFunction<String, String, JSONObject>() {
            @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<JSONObject>() {
                    @Override
                    public void accept(@NonNull JSONObject jsonObject) throws Exception {
                        textView.setText(jsonObject.toString());
                    }
                });
    }

 (图一)    结果输出

 

 

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

将两个发射器合并成一个发射器, 依次发送,发送完一个再接着发送第二个
//原始方法
public static <T> Observable<T> concat(ObservableSource<? extends T> source1, ObservableSource<? extends T> 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<Integer>() {
                    @Override
                    public void accept(@NonNull Integer integer) throws Exception {
                        textView.setText(buffer.append(integer + "--->").toString());
                    }
                });
    }

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

public static <T> Observable<T> merge(ObservableSource<? extends T> source1, ObservableSource<? extends T> source2) {
    ObjectHelper.requireNonNull(source1, "source1 is null");
    ObjectHelper.requireNonNull(source2, "source2 is null");
    return fromArray(source1, source2).flatMap((Function)Functions.identity(), false, 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<Integer>() {
            @Override
            public void accept(@NonNull Integer integer) throws Exception {
                textView.append("merge :" + integer + "\n");
            }
        });
    }

 

 

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值