RxJava:延迟一段时间后返回一个Observable

时间:2016-12-12 11:44:18

标签: java rx-java

我是RxJava的新手,需要一些帮助来完成我的任务。

1

我有一个服务应该以每秒一个速度绘制形状并返回具有该形状的Observable。这意味着,方法应在请求后一秒钟后返回形状。毫不拖延,它有效。有人告诉我使用计时器,但实施时遇到了麻烦。

我试图使用类似的东西,但它没有返回任何东西:

public Observable<PaintedCircle> paint(Shape shape) {
        return Observable
                .timer(1, TimeUnit.SECONDS)
                .flatMap(x -> Observable.just(new PaintedCircle(shape.getSize())));
    }

当我没有flatMap时,它会立即返回对象。

2

我的制作人生成一个包含大量形状对象(圆圈和正方形)的列表。我需要丢掉太少的圆圈,画出形状(第一个问题中描述的服务),然后将形状放入&#34;框中。 - 按照从绘画中返回的顺序将5个部分放入每个盒子中。然后应将每个盒子的所有形状打印到控制台。

问题:可以在公共流中完成吗?怎么样?

我这样开始了这个流,但需要帮助才能继续:

Producer producer = new Producer();
        Observable.from(producer.produceShapes(20))
                .filter(shape -> shape instanceof Square || shape instanceof Circle && shape.getSize() > CIRCLE_MIN_SIZE)
                .flatMap(shape -> shape.getPaintingService().paint(shape));
//                .subscribe(System.out::print);
    }

1 个答案:

答案 0 :(得分:2)

我不想理解您的第一个问题,但如果您想每秒发出一个值,请查看interval运算符:timer将在第一秒后发出一次,然后完成。 intervale每秒会发出一次(如果你不终止你的流,永远不会完成)

 public Observable<PaintedCircle> paint(Shape shape) {
    return Observable.interval(1, TimeUnit.SECONDS)  
                     .map(x -> new PaintedCircle(shape.getSize());
}

请注意:在这种情况下,可以使用map代替flatMap

对于第二个问题,您可以查看运算符buffer:您可以缓冲5个元素列表中的项目,例如

    Producer producer = new Producer();
    Observable.from(producer.produceShapes(20))
              .filter(shape -> shape instanceof Square || shape instanceof Circle && shape.getSize() > CIRCLE_MIN_SIZE)
             .flatMap(shape -> shape.getPaintingService().paint(shape));
             .buffer(5)
             // shapes will be a list of 5 shape
             .map(shapes -> new Box(shapes))
             .subscribe(box -> {
                  System.out.println("BOX ---> " + box.getName());
                  box.getShapes().foreach(System.out::println);
             });