RxJava Join函数的理解
2016-12-15 11:22
309 查看
RxJava的join函数官方表述比较模糊,较难理解。研究了一些时间后终于明白到底是真么回事,先上代码:
这段代码输出是这样子的:
Item is aLong2 = 0,aLong2 = 0
Item is aLong2 = 1,aLong2 = 0
Item is aLong2 = 0,aLong2 = 1
Item is aLong2 = 1,aLong2 = 1
Item is aLong2 = 2,aLong2 = 0
Item is aLong2 = 2,aLong2 = 1
Item is aLong2 = 0,aLong2 = 2
Item is aLong2 = 1,aLong2 = 2
Item is aLong2 = 2,aLong2 = 2
Item is aLong2 = 3,aLong2 = 0
Item is aLong2 = 3,aLong2 = 1
Item is aLong2 = 3,aLong2 = 2
Item is aLong2 = 0,aLong2 = 3
Item is aLong2 = 1,aLong2 = 3
Item is aLong2 = 2,aLong2 = 3
Item is aLong2 = 3,aLong2 = 3
Item is aLong2 = 4,aLong2 = 0
Item is aLong2 = 4,aLong2 = 1
Item is aLong2 = 4,aLong2 = 2
Item is aLong2 = 4,aLong2 = 3
Item is aLong2 = 0,aLong2 = 4
Item is aLong2 = 1,aLong2 = 4
Item is aLong2 = 2,aLong2 = 4
Item is aLong2 = 3,aLong2 = 4
Item is aLong2 = 4,aLong2 = 4
Item is aLong2 = 5,aLong2 = 0
Item is aLong2 = 5,aLong2 = 1
Item is aLong2 = 5,aLong2 = 2
Item is aLong2 = 5,aLong2 = 3
Item is aLong2 = 5,aLong2 = 4
Item is aLong2 = 0,aLong2 = 5
Item is aLong2 = 1,aLong2 = 5
Item is aLong2 = 2,aLong2 = 5
Item is aLong2 = 3,aLong2 = 5
Item is aLong2 = 4,aLong2 = 5
Item is aLong2 = 5,aLong2 = 5
Item is aLong2 = 6,aLong2 = 0
Item is aLong2 = 6,aLong2 = 1
Item is aLong2 = 6,aLong2 = 2
Item is aLong2 = 6,aLong2 = 3
Item is aLong2 = 6,aLong2 = 4
Item is aLong2 = 6,aLong2 = 5
Item is aLong2 = 2,aLong2 = 6
Item is aLong2 = 3,aLong2 = 6
Item is aLong2 = 4,aLong2 = 6
Item is aLong2 = 5,aLong2 = 6
Item is aLong2 = 6,aLong2 = 6
Item is aLong2 = 7,aLong2 = 0
Item is aLong2 = 7,aLong2 = 1
Item is aLong2 = 7,aLong2 = 2
Item is aLong2 = 7,aLong2 = 3
Item is aLong2 = 7,aLong2 = 4
Item is aLong2 = 7,aLong2 = 5
Item is aLong2 = 7,aLong2 = 6
Item is aLong2 = 3,aLong2 = 7
Item is aLong2 = 4,aLong2 = 7
Item is aLong2 = 5,aLong2 = 7
Item is aLong2 = 6,aLong2 = 7
Item is aLong2 = 7,aLong2 = 7
Item is aLong2 = 8,aLong2 = 0
Item is aLong2 = 8,aLong2 = 1
Item is aLong2 = 8,aLong2 = 2
Item is aLong2 = 8,aLong2 = 3
Item is aLong2 = 8,aLong2 = 4
Item is aLong2 = 8,aLong2 = 5
Item is aLong2 = 8,aLong2 = 6
Item is aLong2 = 8,aLong2 = 7
Item is aLong2 = 4,aLong2 = 8
Item is aLong2 = 5,aLong2 = 8
Item is aLong2 = 6,aLong2 = 8
Item is aLong2 = 7,aLong2 = 8
Item is aLong2 = 8,aLong2 = 8
Item is aLong2 = 9,aLong2 = 0
Item is aLong2 = 9,aLong2 = 1
Item is aLong2 = 9,aLong2 = 2
Item is aLong2 = 9,aLong2 = 3
Item is aLong2 = 9,aLong2 = 4
Item is aLong2 = 9,aLong2 = 5
Item is aLong2 = 9,aLong2 = 6
Item is aLong2 = 9,aLong2 = 7
Item is aLong2 = 9,aLong2 = 8
Item is aLong2 = 5,aLong2 = 9
Item is aLong2 = 6,aLong2 = 9
Item is aLong2 = 7,aLong2 = 9
Item is aLong2 = 8,aLong2 = 9
Item is aLong2 = 9,aLong2 = 9
Item is aLong2 = 10,aLong2 = 0
Item is aLong2 = 10,aLong2 = 1
Item is aLong2 = 10,aLong2 = 2
Item is aLong2 = 10,aLong2 = 3
Item is aLong2 = 10,aLong2 = 4
Item is aLong2 = 10,aLong2 = 5
Item is aLong2 = 10,aLong2 = 6
Item is aLong2 = 10,aLong2 = 7
Item is aLong2 = 10,aLong2 = 8
Item is aLong2 = 10,aLong2 = 9
Item is aLong2 = 6,aLong2 = 10
Item is aLong2 = 7,aLong2 = 10
Item is aLong2 = 8,aLong2 = 10
Item is aLong2 = 9,aLong2 = 10
Item is aLong2 = 10,aLong2 = 10
Item is aLong2 = 11,aLong2 = 1
Item is aLong2 = 11,aLong2 = 2
Item is aLong2 = 11,aLong2 = 3
Item is aLong2 = 11,aLong2 = 4
Item is aLong2 = 11,aLong2 = 5
Item is aLong2 = 11,aLong2 = 6
Item is aLong2 = 11,aLong2 = 7
Item is aLong2 = 11,aLong2 = 8
Item is aLong2 = 11,aLong2 = 9
Item is aLong2 = 11,aLong2 = 10
Item is aLong2 = 7,aLong2 = 11
Item is aLong2 = 8,aLong2 = 11
Item is aLong2 = 9,aLong2 = 11
Item is aLong2 = 10,aLong2 = 11
Item is aLong2 = 11,aLong2 = 11
由结果可以分析出:
join的效果类似于排列组合,
两个数据源left和right都根据自己的节奏来发射数据,
当left发射时,会和right的定义的时间间隔内发射的所有数据都进行互动。
比如当left发出11时候,和right在时间间格10秒内发出的1-10组合;right在这段时间内发射了10个,就会调用10次onNext()。
反之,当right发射数据时候,会和left定义的时间间隔内发射的所有数据也都进行互动。
比如当right发出10时候,和left在时间间隔5秒内发出的6-10组合;left在这段时间发射了5个数据,也会调用5次onNext()。
现在你们明白了吗?
import java.util.concurrent.TimeUnit; import rx.Observable; import rx.Observer; import rx.functions.Func1; import rx.functions.Func2; public class JoinTest { public static void main(String argv[]) { /* * zip()和merge()方法作用在发射数据的范畴内,在决定如何操作值之前有些场景我们需要考虑时间的。 * RxJava的join()函数基于时间窗口将两个Observables发射的数据结合在一起。 * * */ Observable<Long> ob1 = Observable.interval(1, TimeUnit.SECONDS); Observable<Long> ob2 = Observable.interval(1, TimeUnit.SECONDS); /** * 第二个Observable和源Observable结合。 * Func1参数:在指定的由时间窗口定义时间间隔内,源Observable发射的数据和从第二个Observable发射的数据相互配合返回的Observable。 * Func1参数:在指定的由时间窗口定义时间间隔内,第二个Observable发射的数据和从源Observable发射的数据相互配合返回的Observable。 * Func2参数:定义已发射的数据如何与新发射的数据项相结合。 */ ob1.join(ob2, new Func1<Long, Observable<Long>>() { @Override public Observable<Long> call(Long aLong) { return Observable.timer(5, TimeUnit.SECONDS); } }, new Func1<Long, Observable<Long>>() { @Override public Observable<Long> call(Long aLong) { return Observable.timer(10, TimeUnit.SECONDS); } }, new Func2<Long, Long, String>() { @Override public String call(Long aLong, Long aLong2) { return "aLong2 = " + aLong + ",aLong2 = " + aLong2; } }).subscribe(new Observer<String>() { @Override public void onCompleted() { System.out.println("Observable completed"); } @Override public void onError(Throwable e) { System.out.println("Oh,no! Something wrong happened!" + e); } @Override public void onNext(String item) { System.out.println("Item is " + item); } }); while (true) ; } }
这段代码输出是这样子的:
Item is aLong2 = 0,aLong2 = 0
Item is aLong2 = 1,aLong2 = 0
Item is aLong2 = 0,aLong2 = 1
Item is aLong2 = 1,aLong2 = 1
Item is aLong2 = 2,aLong2 = 0
Item is aLong2 = 2,aLong2 = 1
Item is aLong2 = 0,aLong2 = 2
Item is aLong2 = 1,aLong2 = 2
Item is aLong2 = 2,aLong2 = 2
Item is aLong2 = 3,aLong2 = 0
Item is aLong2 = 3,aLong2 = 1
Item is aLong2 = 3,aLong2 = 2
Item is aLong2 = 0,aLong2 = 3
Item is aLong2 = 1,aLong2 = 3
Item is aLong2 = 2,aLong2 = 3
Item is aLong2 = 3,aLong2 = 3
Item is aLong2 = 4,aLong2 = 0
Item is aLong2 = 4,aLong2 = 1
Item is aLong2 = 4,aLong2 = 2
Item is aLong2 = 4,aLong2 = 3
Item is aLong2 = 0,aLong2 = 4
Item is aLong2 = 1,aLong2 = 4
Item is aLong2 = 2,aLong2 = 4
Item is aLong2 = 3,aLong2 = 4
Item is aLong2 = 4,aLong2 = 4
Item is aLong2 = 5,aLong2 = 0
Item is aLong2 = 5,aLong2 = 1
Item is aLong2 = 5,aLong2 = 2
Item is aLong2 = 5,aLong2 = 3
Item is aLong2 = 5,aLong2 = 4
Item is aLong2 = 0,aLong2 = 5
Item is aLong2 = 1,aLong2 = 5
Item is aLong2 = 2,aLong2 = 5
Item is aLong2 = 3,aLong2 = 5
Item is aLong2 = 4,aLong2 = 5
Item is aLong2 = 5,aLong2 = 5
Item is aLong2 = 6,aLong2 = 0
Item is aLong2 = 6,aLong2 = 1
Item is aLong2 = 6,aLong2 = 2
Item is aLong2 = 6,aLong2 = 3
Item is aLong2 = 6,aLong2 = 4
Item is aLong2 = 6,aLong2 = 5
Item is aLong2 = 2,aLong2 = 6
Item is aLong2 = 3,aLong2 = 6
Item is aLong2 = 4,aLong2 = 6
Item is aLong2 = 5,aLong2 = 6
Item is aLong2 = 6,aLong2 = 6
Item is aLong2 = 7,aLong2 = 0
Item is aLong2 = 7,aLong2 = 1
Item is aLong2 = 7,aLong2 = 2
Item is aLong2 = 7,aLong2 = 3
Item is aLong2 = 7,aLong2 = 4
Item is aLong2 = 7,aLong2 = 5
Item is aLong2 = 7,aLong2 = 6
Item is aLong2 = 3,aLong2 = 7
Item is aLong2 = 4,aLong2 = 7
Item is aLong2 = 5,aLong2 = 7
Item is aLong2 = 6,aLong2 = 7
Item is aLong2 = 7,aLong2 = 7
Item is aLong2 = 8,aLong2 = 0
Item is aLong2 = 8,aLong2 = 1
Item is aLong2 = 8,aLong2 = 2
Item is aLong2 = 8,aLong2 = 3
Item is aLong2 = 8,aLong2 = 4
Item is aLong2 = 8,aLong2 = 5
Item is aLong2 = 8,aLong2 = 6
Item is aLong2 = 8,aLong2 = 7
Item is aLong2 = 4,aLong2 = 8
Item is aLong2 = 5,aLong2 = 8
Item is aLong2 = 6,aLong2 = 8
Item is aLong2 = 7,aLong2 = 8
Item is aLong2 = 8,aLong2 = 8
Item is aLong2 = 9,aLong2 = 0
Item is aLong2 = 9,aLong2 = 1
Item is aLong2 = 9,aLong2 = 2
Item is aLong2 = 9,aLong2 = 3
Item is aLong2 = 9,aLong2 = 4
Item is aLong2 = 9,aLong2 = 5
Item is aLong2 = 9,aLong2 = 6
Item is aLong2 = 9,aLong2 = 7
Item is aLong2 = 9,aLong2 = 8
Item is aLong2 = 5,aLong2 = 9
Item is aLong2 = 6,aLong2 = 9
Item is aLong2 = 7,aLong2 = 9
Item is aLong2 = 8,aLong2 = 9
Item is aLong2 = 9,aLong2 = 9
Item is aLong2 = 10,aLong2 = 0
Item is aLong2 = 10,aLong2 = 1
Item is aLong2 = 10,aLong2 = 2
Item is aLong2 = 10,aLong2 = 3
Item is aLong2 = 10,aLong2 = 4
Item is aLong2 = 10,aLong2 = 5
Item is aLong2 = 10,aLong2 = 6
Item is aLong2 = 10,aLong2 = 7
Item is aLong2 = 10,aLong2 = 8
Item is aLong2 = 10,aLong2 = 9
Item is aLong2 = 6,aLong2 = 10
Item is aLong2 = 7,aLong2 = 10
Item is aLong2 = 8,aLong2 = 10
Item is aLong2 = 9,aLong2 = 10
Item is aLong2 = 10,aLong2 = 10
Item is aLong2 = 11,aLong2 = 1
Item is aLong2 = 11,aLong2 = 2
Item is aLong2 = 11,aLong2 = 3
Item is aLong2 = 11,aLong2 = 4
Item is aLong2 = 11,aLong2 = 5
Item is aLong2 = 11,aLong2 = 6
Item is aLong2 = 11,aLong2 = 7
Item is aLong2 = 11,aLong2 = 8
Item is aLong2 = 11,aLong2 = 9
Item is aLong2 = 11,aLong2 = 10
Item is aLong2 = 7,aLong2 = 11
Item is aLong2 = 8,aLong2 = 11
Item is aLong2 = 9,aLong2 = 11
Item is aLong2 = 10,aLong2 = 11
Item is aLong2 = 11,aLong2 = 11
由结果可以分析出:
join的效果类似于排列组合,
两个数据源left和right都根据自己的节奏来发射数据,
当left发射时,会和right的定义的时间间隔内发射的所有数据都进行互动。
比如当left发出11时候,和right在时间间格10秒内发出的1-10组合;right在这段时间内发射了10个,就会调用10次onNext()。
反之,当right发射数据时候,会和left定义的时间间隔内发射的所有数据也都进行互动。
比如当right发出10时候,和left在时间间隔5秒内发出的6-10组合;left在这段时间发射了5个数据,也会调用5次onNext()。
现在你们明白了吗?
相关文章推荐
- 【JAVA】java coding规范
- [jjzhu学hadoop]之hadoop2.7.3源码编译eclipse项目
- Spring集成ehcache
- SpringMVC 和Struts2的区别
- Spring核心思想,IoC与DI详解(如果还不明白,放弃java吧)
- 如何压制jar包
- Jersey支持spring3配置
- 根据List里面的对象属性对对象排序
- 怎样去掉Eclipse中的Js错误提示
- JAVA深复制(深克隆)与浅复制(浅克隆)
- 内存泄露java.lang.OutOfMemoryError: PermGen space解决方法
- 1Eclipse怎么查看某个断点的值,还可以通过什么快捷键查看 2debug查看某个变量的值,可能查看不全
- 算法训练 P1103
- Java 代码性能优化
- WebService 的创建,部署和使用
- java读取、创建xml(通过dom方式)
- java 利用ManagementFactory获取jvm,os的一些信息--转
- 搭建基于Spring Cloud的微服务注册中心
- 基于crawler4j、jsoup、javacsv的爬虫实践
- Java守护线程的理解