RxJava:zip命令的使用

在这里插入图片描述
使用zip方法可以把多个类型不同的数据源Observable合并为一个类型的数据源Observable。

public static <T1, T2, R> Observable<R> zip(Observable<? extends T1> o1, Observable<? extends T2> o2, final Func2<? super T1, ? super T2, ? extends R> zipFunction)

举个例子:
我有一个Apple,我还有一个Pen,我想要组合一个ApplePen

    private Observable<Apple> obApple = Observable.just(new Apple());
    private Observable<Pen> obPen = Observable.just(new Pen());

    @Test
    public void zip(){
        Observable.zip(obApple, obPen, new Func2<Apple, Pen, ApplePen>() {
            @Override
            public ApplePen call(Apple apple, Pen pen) {
                return new ApplePen(apple,pen);
            }
        }).subscribe(new Action1<ApplePen>() {
            @Override
            public void call(ApplePen applePen) {
                System.out.println("applePen = " + applePen);
            }
        });
    }

输出:

applePen = rxjava.zip.ApplePen@880ec60

rxjava提供了zip方法的多个重载方法,最多支持九个类型不同的数据源Observable合并。

    public static <T1, T2, T3, T4, T5, T6, T7, T8, T9, R> Observable<R> zip(Observable<? extends T1> o1, Observable<? extends T2> o2, Observable<? extends T3> o3, Observable<? extends T4> o4, Observable<? extends T5> o5, Observable<? extends T6> o6, Observable<? extends T7> o7, Observable<? extends T8> o8,
            Observable<? extends T9> o9, Func9<? super T1, ? super T2, ? super T3, ? super T4, ? super T5, ? super T6, ? super T7, ? super T8, ? super T9, ? extends R> zipFunction)

如果觉得九个类型依然无法满足需求,rxjava贴心的提供了数组参数,不限类型个数,尽情合并:

public static <R> Observable<R> zip(Observable<?>[] ws, FuncN<? extends R> zipFunction) 

测试:


    private Observable<Apple> obApple = Observable.just(new Apple());
    private Observable<Pen> obPen = Observable.just(new Pen());

	@Test
    public void zipArray(){
        Observable.zip(new Observable[]{obApple,obPen}, new FuncN<String>() {
            @Override
            public String call(Object... args) {
                return "args = " + Arrays.deepToString(args);
            }
        }).subscribe(new Action1<String>() {
            @Override
            public void call(String s) {
                System.out.println(s);
            }
        });
    }

输出:

args = [rxjava.zip.Apple@7a79be86, rxjava.zip.Pen@34ce8af7]

既然有数据类型的参数,理所当然也有迭代器类型的参数:

    public static <R> Observable<R> zip(Iterable<? extends Observable<?>> ws, FuncN<? extends R> zipFunction)

测试:

    private Observable<Apple> obApple = Observable.just(new Apple());
    private Observable<Pen> obPen = Observable.just(new Pen());
    
    @Test
    public void zipIterator(){
        Set<Observable<?>> set = new HashSet<>();
        set.add(obApple);
        set.add(obPen);
        Observable.zip(set,new FuncN<String>(){
            @Override
            public String call(Object... args) {
                return "args = " + Arrays.deepToString(args);
            }
        }).subscribe(new Action1<String>() {
            @Override
            public void call(String s) {
                System.out.println(s);
            }
        });
    }

输出:

args = [rxjava.zip.Pen@b684286, rxjava.zip.Apple@880ec60]

除此之外,使用Observable包裹Observable,也能实现合并多个类型:

    public static <R> Observable<R> zip(Observable<? extends Observable<?>> ws, final FuncN<? extends R> zipFunction)

测试:

    private Observable<Apple> obApple = Observable.just(new Apple());
    private Observable<Pen> obPen = Observable.just(new Pen());
    
    @Test
    public void zipObservable(){
        Observable.zip(Observable.just(obApple, obPen), new FuncN<String>() {
            @Override
            public String call(Object... args) {
                return "args = " + Arrays.deepToString(args);
            }
        }).subscribe(s->{
            System.out.println(s);
        });
    }

输出:

args = [rxjava.zip.Apple@61dc03ce, rxjava.zip.Pen@50f8360d]

效果和使用数据,或者迭代器一样。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值