组合操作符

继上一篇讲述了过滤操作符,这一篇讲述组合操作符,组合操作符可用于组合多个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




扫码关注公众号有惊喜

(转载本站文章请注明作者和出处 方志朋的博客

一篇RxJava友好的文章(三)的更多相关文章

  1. 一篇RxJava友好的文章(二)

    上一篇文章介绍了rxjava的基本用法,和一些常用的操作符,以及rxjava的链式操作带来的好处.由于rxjava非常的强大,让我如此的痴迷,我打算写五篇文章,专门讲解rxjava 常见的操作符和用法 ...

  2. 一篇RxJava友好的文章(一)

    转载请标明出处: http://blog.csdn.net/forezp/article/details/52886700 本文出自方志朋的博客 Rxjava在目前的开发中已经是如火如荼,非常的流行, ...

  3. JVM系列文章(三):Class文件内容解析

    作为一个程序猿,只知道怎么用是远远不够的.起码,你须要知道为什么能够这么用.即我们所谓底层的东西. 那究竟什么是底层呢?我认为这不能一概而论.以我如今的知识水平而言:对于Web开发人员,TCP/IP. ...

  4. 《转载-两篇很好的文章整合》Android中自定义控件

    两篇很好的文章,有相互借鉴的地方,整合到一起收藏 分别转载自:http://blog.csdn.net/xu_fu/article/details/7829721 http://www.cnblogs ...

  5. 2016年1月25日 《1024伐木累》-小白篇之开发网站,三天!(中篇-2奇怪的IE)-总章节十一

    往期回顾:  老王的“先见之明”,解决了困扰耗仔三人的大难题.顺利安装完开发工具,大家投入紧张的工作.航空部领导的突然闯入,IE不兼容,页面错乱,摆在三人面前的形势依然严峻.第一次见这阵仗的耗仔,又会 ...

  6. iOS开发UI篇—Quartz2D简单使用(三)

    iOS开发UI篇—Quartz2D简单使用(三) 一.通过slider控制圆的缩放 1.实现过程 新建一个项目,新建一个继承自UIview的类,并和storyboard中自定义的view进行关联. 界 ...

  7. (转)干货|这篇TensorFlow实例教程文章告诉你GANs为何引爆机器学习?(附源码)

    干货|这篇TensorFlow实例教程文章告诉你GANs为何引爆机器学习?(附源码) 该博客来源自:https://mp.weixin.qq.com/s?__biz=MzA4NzE1NzYyMw==& ...

  8. Java多线程编程实战指南(核心篇)读书笔记(三)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76686044冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...

  9. 给B公司的一些建议(又一篇烂尾的文章)

    感慨:太多太多的悲伤故事,发生在自己身上,发生在自己的身边.因此,为了避免总是走"弯路",走"错误"的道路,最近一直在完善自己的理论模型. 烂尾说明:本文是一篇 ...

随机推荐

  1. line-height 150%和1.5的区别

    好惨啊,九点多了没事做还不能下班,坑爹的测试啊~~~ 刚才拿这个问题调戏了下部门一位资深前端开发,结果发现,他居然不会,呵呵~~~ 这里就说下吧 html: <div class="p ...

  2. 性能测试工具Jmeter03-功能概要

    Jmeter工具组成部分 资源生成器:用于生成测试过程中服务器.负载机的资源代码.(LR中的VuGen) 用户运行器:通常是一个脚本运行引擎,根据脚本要求模拟指定的用户行为.(LR中的Controll ...

  3. httpUrlConnection连接网络的用法(用到了handle传递消息,在主线程中更新UI)

    由于httpclient在Android5.0以后已经过时,所以官方推荐使用httpUrlConnection来连接网络,现将该连接的基本方法展示,如下 注意:记得加入<uses-permiss ...

  4. (转)linux常见故障一:linux 文件系统变只读

    linux常见故障一:linux 文件系统变只读 原文:https://www.cnblogs.com/ginvip/p/6375672.html 1. 重启系统看是否可以自动修复. 2. 使用fsc ...

  5. FlashFXP出现“数据Socket错误,连接超时”解决方案

    把FlashFXP选项中的"使用被动模式"的勾去掉就正常了. 或者在路由上映射服务端设定的被动模式所使用的所有端口,server-u就10个左右,微软的ftp是多少个,偶就不清楚了 ...

  6. [转]asp.net core视图组件(ViewComponent)简单使用

    本文转自:http://www.cnblogs.com/dralee/p/6170496.html 一.组成: 一个视图组件包括两个部分,派生自ViewComponent的类及其返回结果.类似控制器. ...

  7. 再次梳理css3动画部分知识

    1.transform: 适用于2D或3D转换的元素 transform-origin:元素的位置点 css3转换(2D转换和3D转换):可以对元素进行移动.缩放.转动.拉长或拉伸. 2D转换:tra ...

  8. C#之Clone

    因为类的实例是引用类型,要想用原有的类中的实例的数据的话,既要想创建原对象的一个副本的话,只能用clone方法. Clone方法分为深clone和浅clone 在C#中提供了浅clone的方法,即为M ...

  9. 如何使用JWT来实现单点登录功能

    我们平时自己开发项目,分布式的结构时,访问量不大,但是又不想搭建redis服务器,这时我觉得jwt不错. 个人理解,jwt就是类似于一把锁和钥匙,客户来租房(登录),我们需要给他进来(第一次登录)登记 ...

  10. 一些实用的浏览器meta

    标签: 兼容性 meta 通用 <!--声明文档使用的字符编码--> <meta charset='utf-8′> <!--viewport定义--> <me ...