【问题标题】:rxjava2 - how to create an infinite integer sequence generator?rxjava2 - 如何创建一个无限整数序列生成器?
【发布时间】:2017-05-26 15:13:56
【问题描述】:

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

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

我怎样才能使下面的工作?

例如:

  • seq1 = 1, 2, 3,...,无限
  • seq2 = 5, 10, 15,..., 无限
  • zip(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 -&gt; System.out.println("left: "+pair.getLeft()+" right: "+pair.getRight())).subscribe(); 打印我的值?

感谢您的帮助。

【问题讨论】:

  • 使用Flowable
  • @akarnokd 谢谢!有用。非常感谢您的快速帮助。

标签: rx-java2


【解决方案1】:

根据@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();
}

【讨论】:

    猜你喜欢
    • 2013-01-03
    • 2023-03-17
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    • 1970-01-01
    相关资源
    最近更新 更多