Rxjava操作符讲解(4)Combining 结合操作

之前没有了解过Rxjava的童鞋,建议先阅读《Rxjava 从入门到开发》这篇文章,对入门比较有帮助。

StartWith操作符

作用:在数据序列的开头增加一项数据

Observable.just(1,2).startWith(Observable.just(-1)).observeOn(Schedulers.io()).subscribe(new Action1<Integer>() {
        @Override
        public void call(Integer aLong) {
            Logger.i(String.valueOf(aLong));
        }
    });

输出结果:

例子说明:在Startwith的作用下-1输出在结果的最前面。

CombineLatest操作符

作用:当两个Observables中的任何一个发射了数据时,使用一个函数结合每个Observable发射的最近数据项,并且基于这个函数的结果发射数据。

     //产生0,5,10数列
    Observable<Long> observable1 = Observable.interval(1000, TimeUnit.MILLISECONDS)
            .map(new Func1<Long, Long>() {
                @Override
                public Long call(Long aLong) {
                    return aLong * 5;
                }
            }).take(3);

    //产生0,10,20数列
    Observable<Long> observable2 = Observable.interval(500, TimeUnit.MILLISECONDS)
            .map(new Func1<Long, Long>() {
                @Override
                public Long call(Long aLong) {
                    return aLong * 10;
                }
            }).take(3);


    subscription=Observable.combineLatest(observable1, observable2, new Func2<Long, Long, Long>() {
        @Override
        public Long call(Long aLong, Long aLong2) {
            System.out.println("aLong: " + aLong+"  aLong2: "+aLong2);

            return aLong+aLong2;
        }
    }).subscribe(new Subscriber<Long>() {
        @Override
        public void onCompleted() {
            System.out.println("Sequence complete.");
        }

        @Override
        public void onError(Throwable e) {
            System.err.println("Error: " + e.getMessage());
        }

        @Override
        public void onNext(Long aLong) {
            System.out.println("Next: " + aLong);
        }
    });

输出结果:

例子说明:observable1输出的是0,5,10;observable2输出的是0,10,20,输出结果的关系如下图:


数字的间隔就是时间差。

Join操作符

作用:join操作符把类似于combineLatest操作符,也是两个Observable产生的结果进行合并,合并的结果组成一个新的Observable,但是join操作符可以控制每个Observable产生结果的生命周期,在每个结果的生命周期内,可以与另一个Observable产生的结果按照一定的规则进行合并。

join方法有四个参数,具体定义如下:
observableA.join(observableB, observableA产生结果生命周期控制函数, observableB产生结果生命周期控制函数, observableA产生的结果与observableB产生的结果的合并规则)

    //产生0,5数列
    Observable<Long> observable1 = Observable.interval(1000, TimeUnit.MILLISECONDS)
            .map(new Func1<Long, Long>() {
                @Override
                public Long call(Long aLong) {
                    return aLong * 5;
                }
            }).take(3);

    //产生0,10,20数列
    Observable<Long> observable2 = Observable.interval(1000, TimeUnit.MILLISECONDS)
            .map(new Func1<Long, Long>() {
                @Override
                public Long call(Long aLong) {
                    return aLong * 10;
                }
            }).take(3);

    subscription=observable1.join(observable2, new Func1<Long, Observable<Long>>() {
        @Override
        public Observable<Long> call(Long aLong) {
            return Observable.just(aLong).delay(500, TimeUnit.MILLISECONDS);
        }
    }, new Func1<Long, Observable<Long>>() {
        @Override
        public Observable<Long> call(Long aLong) {
            return Observable.just(aLong).delay(1000, TimeUnit.MILLISECONDS);
        }
    }, new Func2<Long, Long, Long>() {
        @Override
        public Long call(Long aLong, Long aLong2) {
            System.out.println("aLong: " + aLong+"  aLong2: "+aLong2);
            return aLong + aLong2;
        }
    }).subscribe(new Subscriber<Long>() {
        @Override
        public void onCompleted() {
            System.out.println("Sequence complete.");
        }

        @Override
        public void onError(Throwable e) {
            System.err.println("Error: " + e.getMessage());
        }

        @Override
        public void onNext(Long aLong) {
            System.out.println("Next: " + aLong);
        }
    });

输出结果:

例子说明:其实输出排列方式和combineLatest差不多,主要差别在通过join可以进一步控制observable结果的输出时间周期,另外顺便一提的是如果observable1输出的数据只有两个,那么即使observable2输出3个数据,但最终输出的也仅有两个。

Merge操作符

作用:将多个Observable合并为一个。

    //产生0,5数列
    Observable<Long> observable1 = Observable.interval(1000, TimeUnit.MILLISECONDS)
            .map(new Func1<Long, Long>() {
                @Override
                public Long call(Long aLong) {
                    return aLong * 5;
                }
            }).take(2);

    //产生0,10,20数列
    Observable<Long> observable2 = Observable.interval(1000, TimeUnit.MILLISECONDS)
            .map(new Func1<Long, Long>() {
                @Override
                public Long call(Long aLong) {
                    return aLong * 10;
                }
            }).take(3);

    subscription=Observable.merge(observable1,observable2).subscribe(new Action1<Long>() {
        @Override
        public void call(Long aLong) {
            System.out.println("out: " + aLong);
        }
    });

输出结果:

例子说明:把observable1,observable2的数据合并输出。

switchOnNext操作符

作用:把一组Observable转换成一个Observable,转换规则为:对于这组Observable中的每一个Observable所产生的结果,如果在同一个时间内存在两个或多个Observable提交的结果,只取最后一个Observable提交的结果给订阅者。

Observable<Observable<Long>> observable = Observable.interval(500, TimeUnit.MILLISECONDS).map(new Func1<Long, Observable<Long>>() {
        @Override
        public Observable<Long> call(Long aLong) {
            //每隔200毫秒产生一组数据(0,10,20,30,40)
            return Observable.interval(200, TimeUnit.MILLISECONDS).map(new Func1<Long, Long>() {
                @Override
                public Long call(Long aLong) {
                    return aLong * 10;
                }
            }).take(3);
        }
    }).take(2);

    subscription=Observable.switchOnNext(observable).subscribe(new Action1<Long>() {
        @Override
        public void call(Long aLong) {
            System.out.println("Next:" + aLong);
        }
    });

输出结果:

Paste_Image.png

例子说明:没人Switch的作用下,输出结果为“0,10,20,0,10,20”,但是在Switch的作用下,结果为“0,10,0,10,20”,少了“20”,这就是switch的作用。

zip操作符

作用:把两个observable提交的结果,严格按照顺序进行合并。

   Observable<Long> observable1=  Observable.interval(1, TimeUnit.SECONDS).take(3);
    Observable<Long> observable2=  Observable.interval(1, TimeUnit.SECONDS).take(4);
    subscription=Observable.zip(observable1, observable2, new Func2<Long, Long, Integer>() {

        @Override
        public Integer call(Long aLong, Long aLong2) {
            System.out.println("aLong:" + aLong+"   aLong2:  "+aLong2);

            return (int) (aLong+aLong);
        }
    }).subscribe(new Action1<Integer>() {
        @Override
        public void call(Integer integer) {
            System.out.println("result:" + integer);
        }
    });

输出结果:

例子说明:最终输出为“0,2,4”,两个Observable输出的数据一一按顺序对应,无法对应的数据就抛弃,例子中的observable2本应该输出4个数据take(4)但是由于操作符zip的作用下,最终只输出3个数据。

以上便是结合操作符的主要内容了。rxjava的主要操作符讲了差不多,有啥问题欢迎大家留言交流下😊,欢迎关注。

附录:
文章demo

参考:
ReactiveX/RxJava文档中文版
Android RxJava使用介绍(四) RxJava的操作符

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容