2016-12-13 48 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); 
} 
相關問題