RxJava Join函数的理解

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

现在你们明白了吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值