一篇RxJava友好的文章(三)

组合操作符

继上一篇讲述了过滤操作符,这一篇讲述组合操作符,组合操作符可用于组合多个Observable。组合操作符相对于过滤操作符要复杂很多,也较难以理解,需要花费时间去看文档查资料,写demo才能有一定的理解,这系列文章的例子将会在系列文章写完同意上传,敬请期待。

1.starWith操作符

starWith是在数据序列的开头插入一条指定的项; 如果你想要一个Observable在发射数据之前先发射一个指定的数据序列,可以使用 StartWith 操作符,原理如图所示。(如果你想一个Observable发射的数据末尾追加一个数据序列可以使用 Concat 操作符,与startwith 相反)

  Observable.just(1,2,3,4,5).startWith(9,8)
     .subscribe(new Action1<Integer>() {
                @Override
                public void call(Integer integer) {
                    Log.e(TAG,""+integer);
                }
            });

程序运行结果:

9,8,1,2,3,4,5

2.CombineLatest操作符

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

Observable.combineLatest(Observable.just(1, 2, 3), 
    Observable.just("a", "b", "c", "d"), new Func2<Integer, String,       String>() {
            @Override
            public String call(Integer integer, String s) {
                Log.e(TAG,"combineLatest:"+"integer:"+integer+">>String:"+s);
                return integer+s;
            }
        }).subscribe(new Action1<String>() {
            @Override
            public void call(String s) {
                Log.e(TAG,s);
            }
        });

运行结果:

3a 3b 3c 3d

CombineLatest 在原始的Observable中任意一个发射了数据 时发射一条数据。当原始Observables的任何一个发射了一条数据时, CombineLatest 使用一个函数结合它们最近发射的数据,然后发射这个函数的返回值。

3.Merge

合并多个Observables的发射物; 使用 Merge 操作符你可以将多个Observables的输出合并,就好像它们是一个单个的Observable一样。Merge 可能会让合并的Observables发射的数据交错(有一个类似的操作符 Concat 不会让数据交错,它会按顺序一个接着一个发射多个Observables的发射物)。

Observable.merge(Observable.just(1,3,4,5),Observable.just(22,33,44))
    .subscribe(new Action1<Integer>() {
            @Override
            public void call(Integer integer) {
                Log.e(TAG,""+integer);
            }
        });

运行结果:

1,2,3,4,5,22,33,44

4.zip

Zip 操作符返回一个Obversable,它使用这个函数按顺序结合两个或多个Observables发射的数据项,然后它发射这个函数返回的结果。它按照严格的顺序应用这个函数。它只发射与发射数据项最少的那个Observable一样多的数据。

  Observable.zip(Observable.just(1, 2, 3, 4, 5), 
        Observable.just("a", "b", "c"), new      Func2<Integer, String, String>() {
            @Override
            public String call(Integer integer, String integer2) {
                return integer+integer2;
            }
        })
        .subscribe(new Action1<String>() {
            @Override
            public void call(String s) {
                Log.e(TAG,""+s);
            }
        });

运行结果:

1a ,2b,3c

所有的组合操作符:

这些组合操作符都不是这么容易理解的,需要自己慢慢的领悟,学好rxjava需要投入一定时间和精力,总之多多练习就好了,需要我的这系列文章能够帮助到像我一样对rxjava热爱的人,感谢大家。

(https://github.com/forezp/banya) 项目地址:https://github.com/forezp/banya

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏老九学堂

【必读】C语言基础知识大全

C语言程序的结构认识 用一个简单的c程序例子,介绍c语言的基本构成、格式、以及良好的书写风格,使小伙伴对c语言有个初步认识。 例1:计算两个整数之和的c程...

4208
来自专栏Android先生

Kotlin入门教程,快使用Kotlin吧

数组用Array类实现,和Java不同的地方在于,Array类有一个size属性表示数组长度,还有get和set方法,但是也可以使用array[position...

931
来自专栏闻道于事

Java之面向对象概述,类,构造方法,static,主方法,对象

一、面向对象概述 面向过程 “面向过程”(Procedure Oriented)是一种以过程为中心的编程思想。这些都是以什么正在发生为主要目标进行编程,不同于...

3195
来自专栏向治洪

Kotlin之基本语法

在今年Google IO大会上Google已经明确kotlin作为为Android第一官方语言的地位。我相信Google的决意,就像当初毫不犹豫的抛弃eclip...

2178
来自专栏决胜机器学习

有趣的算法(五) ——Dijkstra双栈四则运算

有趣的算法(五)——Dijkstra双栈四则运算 (原创内容,转载请注明来源,谢谢) 一、概念 近期看到算法书上,提到dijkstra双栈的方法,实现输入一...

5457
来自专栏向治洪

Kotlin之基本语法

在今年Google IO大会上Google已经明确kotlin作为为Android第一官方语言的地位。我相信Google的决意,就像当初毫不犹豫的抛弃eclip...

2427
来自专栏Golang语言社区

Go 语言的基本数据类型

0)变量声明 var 变量名字 类型 = 表达式 例: var num int = 10 复制代码 其中“类型”或“= 表达式”两个部分可以省略其中的一个。 1...

38611
来自专栏Android干货园

Kotlin中级(8)- - - Kotlin类之接口、枚举.md

652
来自专栏北京马哥教育

Python语言中list及tuple的使用示例

Python语言中的list Python有一种内置数据类型被称为列表:list。 1.list基本定义 list是一种有序的集合,可以随时添加和删除其中的元...

3127
来自专栏Micro_awake web

JavaScript实现八大内部排序算法

? 注:基数排序中:r是关键字的基数,d是长度,n是关键字的个数 1.插入排序 基本思想:在序号i之前的元素(0到i-1)已经排好序,本趟需要找到i对应的元素...

2339

扫码关注云+社区