rxjava2 - 如何创建无限整数序列生成器?

时间:2017-05-26 15:13:56

标签: rx-java2

使用rxjava2,我试图创建两个无限整数流序列,将序列组合在一起以创建对并打印结果。

由于我不明白的原因,我的代码在执行zip函数时会创建一个无限循环。就像zip函数在开始发出项目之前等待无限序列完成一样。

如何进行以下工作?

E.g:

  • seq1 = 1,2,3,...,无限
  • seq2 = 5,10,15,...,无限
  • 拉链(SEQ1, seq2)=(1,5),(2,10),(3,15),...,无限

我的代码如下:

public Observable<Integer> intervalSequence(int start, int step)
{
    return Observable.generate(()->start,
    (s, emitter)->{
        int next = s+step;
        emitter.onNext(next);
        return next;
    });
}

public Observable<Pair<Integer, Integer>> pageRange(int pageSize){
    Observable<Integer> from = intervalSequence(1, pageSize);
    Observable<Integer> to = intervalSequence(pageSize, pageSize);
    Observable<Pair<Integer, Integer>> fromTo = Observable.zip(from, to, (f, t) -> {
        return Pair.of(f, t);
    });
    return fromTo;
}

@Test
public void pageRangeTest() throws Exception {
    //works
    intervalSequence(1, 5).take(5).doOnNext(nmb -> System.out.println(nmb)).subscribe();
    //Doesn't work
    pageRange(5).take(5).doOnNext(pair -> System.out.println("left: "+pair.getLeft()+" right: "+pair.getRight())).subscribe();
}

如何让pageRange(5).take(5).doOnNext(pair -> System.out.println("left: "+pair.getLeft()+" right: "+pair.getRight())).subscribe();打印我的值?

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

根据@akarnokd的反馈,使用Flowable代替Observable解决了问题。使用Flowable,工作代码为:

public Flowable<Integer> intervalSequence(int start, int step)
{
    return Flowable.generate(()->start,
    (s, emitter)->{
        int next = s+step;
        emitter.onNext(next);
        return next;
    });
}

public Flowable<Pair<Integer, Integer>> pageRange(int pageSize){
    Flowable<Integer> from = intervalSequence(1, pageSize);
    Flowable<Integer> to = intervalSequence(pageSize, pageSize);
    Flowable<Pair<Integer, Integer>> fromTo = Flowable.zip(from, to, (f, 
    t) -> {
        return Pair.of(f, t);
    });
    return fromTo;
}

@Test
public void pageRangeTest() throws Exception {
    pageRange(5).take(5).doOnNext(pair -> System.out.println("left: "+pair.getLeft()+" right: "+pair.getRight())).subscribe();
}