组合Observable

当我们需要处理多个Observable的时候,我们可以通过Rxjava的组合函数来创建我们自己想要的Observable。

Merge

RxJava的 merge() 方法将两个甚至更多的Observables合并到新的发射数据项里。

  1. public static void main(String... args) {
  2. Observable<Integer> observable1 = Observable.just(1, 2, 3);
  3. Observable<Integer> observable2 = Observable.just(11, 22, 33);
  4. Observable.merge(observable1, observable2)
  5. .subscribe(new Observer<Integer>() {
  6. @Override
  7. public void onCompleted() {
  8. System.out.println("onCompleted");
  9. }
  10. @Override
  11. public void onError(Throwable e) {
  12. System.out.println("onError");
  13. }
  14. @Override
  15. public void onNext(Integer integer) {
  16. System.out.println("i = " + integer);
  17. }
  18. });
  19. }

这里我们合并了两个Observable生成了一个新的Observable发射。打印结果:</br>
i = 1</br>
i = 2</br>
i = 3</br>
i = 11</br>
i = 22</br>
i = 33</br>
onCompleted</br>

Concat

Rxjava的concat()用于将多个Observables合并进行发射,与merge()的合并不同的是,concat()严格按照顺序发射数据,前一个Observable没有发射完就不会发射后面的Observable。

ZIP

当然,我们有时候不仅仅想只是合并Observable,还希望能够对数据进行处理再发射出去。RxJava有一个特殊的方法可以完成: zip() 合并两个或者多个Observables发射出的数据项,根据指定的函数 Func* 变换它们,并发射一个新值。

  1. public static void main(String... args) {
  2. Observable<Integer> observable1 = Observable.just(1, 2, 3);
  3. Observable<Integer> observable2 = Observable.just(11, 22, 33);
  4. Observable.zip(observable1, observable2, new Func2<Integer, Integer, Integer>() {
  5. @Override
  6. public Integer call(Integer integer, Integer integer2) {
  7. return integer * integer2;
  8. }
  9. })
  10. .subscribe(new Action1<Integer>() {
  11. @Override
  12. public void call(Integer integer) {
  13. System.out.println("i = " + integer);
  14. }
  15. });
  16. }

这里我们传入了一个Fun2(),在call()方法中对数据进行了相乘的处理,打印结果:</br>
i = 11</br>
i = 44</br>
i = 99</br>

Join

RxJava的 join() 函数基于时间将两个Observables发射的数据结合在一起。先说说它的参数:join(Observable, Func1, Func1, Func2)

  • Observable:与源Observable结合的Observable

  • Func1:接收从源Observable发射的数据,并返回一个Observable,该Observable将会指定一个时间周期作为源Observable发射出来数据的有效期。

  • Func1:接收第二个Observable发射的数据,也返回一个Observable,同样指定一个时间周期作为第二个Observable发射出来数据的有效期。

  • Func2:接收从源Observable和第二个Observable发射的数据,并将接收到的数据进行组合后返回。

    1. public static void main(String... args) {
    2. final String[] s = new String[]{"A", "B", "C", "D", "E", "F"};
    3. Observable<String> observable1 = Observable.interval(1500, TimeUnit.MILLISECONDS)
    4. .map(new Func1<Long, String>() {
    5. @Override
    6. public String call(Long aLong) {
    7. return s[aLong.intValue()];
    8. }
    9. }).take(5);
    10. Observable<Long> observable2 = Observable.interval(1500, TimeUnit.MILLISECONDS);
    11. observable1.join(observable2, new Func1<String, Observable<Long>>() {
    12. @Override
    13. public Observable<Long> call(String s) {
    14. return Observable.timer(1, TimeUnit.SECONDS);
    15. }
    16. }, new Func1<Long, Observable<Long>>() {
    17. @Override
    18. public Observable<Long> call(Long aLong) {
    19. return Observable.timer(1, TimeUnit.SECONDS);
    20. }
    21. }, new Func2<String, Long, String>() {
    22. @Override
    23. public String call(String s, Long aLong) {
    24. return s + aLong;
    25. }
    26. })
    27. .subscribe(new Observer<String>() {
    28. @Override
    29. public void onCompleted() {
    30. System.out.println("onCompleted");
    31. }
    32. @Override
    33. public void onError(Throwable e) {
    34. System.out.println("onError");
    35. }
    36. @Override
    37. public void onNext(String s) {
    38. System.out.println("result = " + s);
    39. }
    40. });
    41. }

首先我们创建了一个Observable1,它将每过1500ms依次发射字符串数组中的一个字母,之后又创建了Observable2,同样每过1500ms依次发射1,2,3...,之后通过join()将两个数据组合在一起,打印结果:</br>
result = A0</br>
result = B1</br>
result = C2</br>
result = D3</br>
result = E4</br>
onCompleted</br>
这里有一个小疑惑,在Android Studio进行RunMain()方法并没有打印出结果就结束了,而我通过debug则打印出了完整的结果,如果有厉害的大神还望多多指教。

combineLatest

Rxjava的combineLatest()函数有点像zip()函数的特殊形式,只不过zip()作用于最近还没有发射的两个Observables,而combineLatest()作用于最近发射的Observables。通过一张图更清晰:

 
combineLatest.png

这里假如这两个可观测序列是同步发射的,一开始A序列发射的1,接着时间到了B发射了A,所以通过combineLatest((x , y) => "" +x+y)变成了1A,然后又到了A发射2的时间点,就组合成了2A,马上B发射了字母B,又组合成了2B,可以看出combineLatest()就是组合Observables发射的最新的数据,而且一旦Observables发射了数据,它也立马接收组合发射新的组合数据。

  1. public static void main(String... args) {
  2. final String[] s = new String[]{"A", "B", "C", "D", "E", "F"};
  3. Observable<String> observable1 = Observable.interval(1500, TimeUnit.MILLISECONDS)
  4. .map(new Func1<Long, String>() {
  5. @Override
  6. public String call(Long aLong) {
  7. return s[aLong.intValue()];
  8. }
  9. }).take(4);
  10. Observable<Long> observable2 = Observable.interval(1000, TimeUnit.MILLISECONDS).take(5);
  11. Observable.combineLatest(observable1, observable2, new Func2<String, Long, String>() {
  12. @Override
  13. public String call(String s, Long aLong) {
  14. return s + aLong;
  15. }
  16. })
  17. .subscribe(new Observer<String>() {
  18. @Override
  19. public void onCompleted() {
  20. System.out.println("onCompleted");
  21. }
  22. @Override
  23. public void onError(Throwable e) {
  24. System.out.println("onError");
  25. }
  26. @Override
  27. public void onNext(String s) {
  28. System.out.println("s = " + s);
  29. }
  30. });
  31. }

这还是join()的代码,只是将join()换成了combineLatest(),打印结果:</br>
s = A0</br>
s = A1</br>
s = B1</br>
s = B2</br>
s = B3</br>
s = C3</br>
s = C4</br>
s = D4</br>
s = F4</br>
onCompleted</br>

StartWith

在Observable开始发射其数据的时候,Rxjava的startWith()通过传递一个参数来先发射一个数据序列。

  1. public static void main(String... args) {
  2. Observable.just(1, 2, 3)
  3. .startWith(7, 8, 9)
  4. .subscribe(new Action1<Integer>() {
  5. @Override
  6. public void call(Integer integer) {
  7. System.out.println("i = " + integer);
  8. }
  9. });
  10. }

在代码中,我们设置了在发射1,2,3之前先发射7,8,9;打印结果:</br>
i = 7</br>
i = 8</br>
i = 9</br>
i = 1</br>
i = 2</br>
i = 3</br>

作者:cgzysan
链接:https://www.jianshu.com/p/14f143c7a3a0
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

RxJava学习笔记(组合Observables)(转)的更多相关文章

  1. RxJava学习笔记(操作符)

    前言 上一篇文章介绍了RxJava的基础知识和简单实现,篇幅已经比较多了,所以把操作符(Operators)相关的内容放在这一篇.有了上一篇文章的基础,相信会比较容易理解操作符相关的内容了. 操作符( ...

  2. RxJava 学习笔记(一)

    最近Android6.0的权限问题,要把之前的APP进行改造,用到了RxPermission框架!之前了解过RXJAVA,但是由于之前项目一直没有使用这个框架,所以也就一直搁置了.正好Rxpermis ...

  3. [Android学习笔记]组合控件的使用

    组合控件的使用 开发过程中,多个UI控件需要协同工作,相互交互之后,才可完成一个完整的业务需求,此时可把这些控件封装成为一个整体,相互之间的交互逻辑封装其中,外部调用可无需关心内部逻辑,只需获取处理后 ...

  4. 学习笔记——组合模式Composite

    组合模式,典型的层次结构. 与装饰器类图相似. 区别在于:装饰器模式是为了在接口中增加方法,而组合模式在于层次元素的叠加. ConcreteComponent就是中间结点,可以包含更多的Concret ...

  5. C#学习笔记-组合模式

    什么是组合模式? 组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构. 组合模式使得用户对单个对象和组合对象的使用具有一致性. 何时使用组合模式? 当需求中是体现部分与 ...

  6. JAVA学习笔记--组合与继承

    JAVA一个很重要的功能就是代码的可复用性,代码复用可以大大提升编程效率.这里主要介绍两种代码复用方式:组合和继承. 一.组合 组合比较直观,只需在新的类中产生现有类的对象,新的类由现有类的对象组成, ...

  7. Rxjava学习笔记

    1.使用Observable.range(int start, int count)创建一个发射特定整数序列的Observable,第一个参数为起始值,第二个为发送的个数,如果为0则不发送,负数则抛异 ...

  8. C#.NET学习笔记11,12---布尔表达式2组合,if语句

    C#.NET学习笔记11---布尔表达式2组合 2013/9/6 技术qq交流群:JavaDream:251572072  教程下载,在线交流:创梦IT社区:www.credream.com int ...

  9. Flutter学习笔记(38)--自定义控件之组合控件

    如需转载,请注明出处:Flutter学习笔记(38)--自定义控件之组合控件 在开始之前想先写点其他的,emm...就是今天在学习到自定义控件的时候,由于自定义控件这块一直是我的短板,无论是Andro ...

随机推荐

  1. Java中equals()和hashCode()的关系以及重写equals()和hashCode()的重要性

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6580647.html  一:关系 如果两个对象相等(equal),它们的hashcode一定相同: 如果两个对 ...

  2. 表访问方式---->通过ROWID访问表(table access by ROWID)

    通过ROWID访问表(table access by ROWID)        ROWID是一个伪列,即是一个非用户定义的列,而又实际存储于数据库之中.每一个表都有一个ROWID列,一个ROWID值 ...

  3. 〖Linux〗Ubuntu中使用KVM安装虚拟机

    1. 安装软件: sudo apt-get install libvirt0 libvirt-bin libvirt-dev virt-manager qemu-system 2. 配置网桥: # i ...

  4. 转:Bullet物理引擎不完全指南(Bullet Physics Engine not complete Guide)

    write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie 讨论新闻组及文件 前言 Bullet据称为游戏世界占有率为第三的物理引擎,也是前几大引擎目前唯一能够 ...

  5. 使用VTK与Python实现机械臂三维模型可视化

    三维可视化系统的建立依赖于三维图形平台, 如 OpenGL.VTK.OGRE.OSG等, 传统的方法多采用OpenGL进行底层编程,即对其特有的函数进行定量操作, 需要开发人员熟悉相关函数, 从而造成 ...

  6. python 第三库卸载办法

    Microsoft Windows [版本 6.1.7601]版权所有 (c) 2009 Microsoft Corporation.保留所有权利. C:\Users\Administrator> ...

  7. python之函数用法isupper()

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #python之函数用法isupper() #http://www.runoob.com/python/att ...

  8. 10个超棒jQuery表单操作代码片段

    jQuery绝对是一个伟大的开源javascript类库,是帮助我们快速和高效开发前端应用的利器.可能大家在日常的开发过程中常常会处理表单相关的javascript,在今天这篇代码片段分享文章中,这里 ...

  9. redhat7.0安装ifconfig

    问题描述: Setup is unable to find the "ifconfig" program on your machine. Please make sure it ...

  10. Android Intent之Action应用

    Log.i("txrjsms", "whereDoYouJumpFrom:"+getIntent().getPackage()); 结果是null Log.i( ...