2016-12-13 76 views
0

我的任务是在Producer中产生一定数量的随机对象(形状 - 圆形或正方形),将它们打印到控制台并在消费者中使用它们。为了生成随机对象,我使用抽象类Shape中的方法getShape,然后在创建Observable时使用defer()来获取每个新对象。RxJava:正确地返回来自Observable的随机对象

对于印刷对象我试图用doOnNext

Observable<Shape> produceShapes(int amount) { 
     System.out.println("Produced following shapes:"); 
     return Observable.defer(() -> Observable.just(Shape.getShape())) 
       .doOnNext(System.out::print) 
       .repeat(amount); 
    } 

消费者的方法是平时Observable.just(new Producer().produceShapes(10))...

的问题是,defer()作品两次 - 在打印过程中的形状和而深受消费者要求他们,使消费者成为不同的形状。

编辑:我试图删除.doOnNext(System.out::print)并打印getShape()方法中的对象,然后将其提供给生产者,但消费者仍然变成不同的形状。

如何解决?我如何创建形状,打印它们并向消费者提供相同的形状?

+0

会发生什么事,如果你删除延迟通话?重复刚才的呼叫还是只呼叫一次? – rob

+0

它会重复。形状对象将只创建一次,并在每次调用时返回。 –

+0

这就是我的想法: - 幸运的是koperko更了解他的rxjava :-) – rob

回答

1

我不明白,你为什么要使用延迟。延迟运算符为每个用户创建新的可观察值。如果你只是想形状 - 值,只是试试这个:

Observable<Shape> produceShapes(int amount) { 
    System.out.println("Produced following shapes:"); 
    return Observable.range(1, amount) 
      .map(index -> Shape.getShape()) 
      .doOnNext(System.out::print); 
} 
相关问题