您的位置:首页 > 编程语言 > Java开发

RxJava Join函数的理解

2016-12-15 11:22 309 查看
RxJava的join函数官方表述比较模糊,较难理解。研究了一些时间后终于明白到底是真么回事,先上代码:

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()。

现在你们明白了吗?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: