Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RxJava:从Observable正确返回随机对象_Java_Rx Java - Fatal编程技术网

RxJava:从Observable正确返回随机对象

RxJava:从Observable正确返回随机对象,java,rx-java,Java,Rx Java,我的任务是在Producer中生成给定数量的随机对象(形状-圆形或方形),将它们打印到控制台,然后在Consumer中使用它们。为了生成随机对象,我在抽象类Shape中使用方法getShape,然后在创建可观察对象时,我使用defer()获取每次新对象 对于打印对象,我尝试使用doOnNext: Observable<Shape> produceShapes(int amount) { System.out.println("Produced following sh

我的任务是在Producer中生成给定数量的随机对象(形状-圆形或方形),将它们打印到控制台,然后在Consumer中使用它们。为了生成随机对象,我在抽象类
Shape
中使用方法
getShape
,然后在创建可观察对象时,我使用
defer()
获取每次新对象

对于打印对象,我尝试使用
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);
    }
可观察的产品形状(整数金额){
System.out.println(“生成以下形状:”);
返回Observable.defer(()->Observable.just(Shape.getShape()))
.doOnNext(系统输出::打印)
.重复(数量);
}
消费者方法通常是可以观察到的。只是(newproducer().produceShapes(10))…

问题是,
defer()
工作两次——打印形状和消费者请求形状时,因此消费者变成了不同的形状

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


怎么解决呢??如何创建形状、打印形状并将相同的形状提供给消费者?

我不明白,为什么要使用“延迟”。延迟操作符为每个订户创建新的可观察对象。如果您只想要数量的形状,请尝试以下方法:

Observable<Shape> produceShapes(int amount) {
    System.out.println("Produced following shapes:");
    return Observable.range(1, amount)
            .map(index -> Shape.getShape())
            .doOnNext(System.out::print);
}
可观察的产品形状(整数金额){
System.out.println(“生成以下形状:”);
可观察的回报范围(1,金额)
.map(index->Shape.getShape())
.doOnNext(系统输出::打印);
}

我不明白,为什么要使用延迟。延迟操作符为每个订户创建新的可观察对象。如果您只想要数量的形状,请尝试以下方法:

Observable<Shape> produceShapes(int amount) {
    System.out.println("Produced following shapes:");
    return Observable.range(1, amount)
            .map(index -> Shape.getShape())
            .doOnNext(System.out::print);
}
可观察的产品形状(整数金额){
System.out.println(“生成以下形状:”);
可观察的回报范围(1,金额)
.map(index->Shape.getShape())
.doOnNext(系统输出::打印);
}

如果删除延迟呼叫会发生什么?刚才的电话会被重复还是只会被重复一次?它会被重复。shape对象只创建一次,每次调用都返回。这就是我的想法:-/幸运的是koperko更了解他的rxjava:-)如果删除延迟调用会发生什么?刚才的电话会被重复还是只会被重复一次?它会被重复。shape对象只创建一次,每次调用都返回。这就是我的想法:-/幸运的是koperko更了解他的rxjava:-)