RX-java2可观测数据的重复消耗

RX-java2可观测数据的重复消耗,java,concurrency,rx-java,reactive-programming,rx-java2,Java,Concurrency,Rx Java,Reactive Programming,Rx Java2,我有3个观测值,第一个观测值的输出是第二个观测值所需要的。第一个和第二个可见光的输出是第三个可见光所需要的 Observable<String> observableOne = Observable .just("{1}") .map(v -> { System.out.println("Executing Observable 1"); return v; });

我有3个观测值,第一个观测值的输出是第二个观测值所需要的。第一个和第二个可见光的输出是第三个可见光所需要的

    Observable<String> observableOne = Observable
        .just("{1}")
        .map(v -> {
            System.out.println("Executing Observable 1");
            return v;
        });

    Observable<String> observableTwo = observableOne
        .map(observableOneValue -> {
            System.out.println("Executing Observable 2");
            return "{2"+observableOneValue+"}";
        });

    Observable.zip(
        observableOne,
        observableTwo,
        (observableOneValue, observableTwoValue) ->
        {
            System.out.println("Executing Observable 3");
            return "{3"+observableOneValue+observableTwoValue+"}";
        }
    ).blockingSubscribe(System.out::println);
observeable-observeOne=可观察
.just(“{1}”)
.map(v->{
System.out.println(“执行可观察1”);
返回v;
});
可观察到的可观察到的
.map(observableOneValue->{
System.out.println(“执行可观察2”);
返回“{2”+observeOnEvalue+”}”;
});
可观察的.zip(
可见的,
所以,,
(observeToEvalue,observeToEvalue)->
{
System.out.println(“执行可观察3”);
返回“{3”+observeToEvalue+observeToEvalue+“}”;
}
).blockingSubscribe(System.out::println);

这将重复执行第一个可观察到的,我当然可以使第一个可观察到的可缓存。但我想知道是否还有比这更好的选择,特别是我正在寻找从第一个观察到另两个观察到的某种消息传递结构

我不确定“消息传递结构”到底在寻找什么<代码>缓存将适用于上面的示例,但您提到您不想使用它

另一个可能适合您的用例的选项是使用。它仅在您对其调用
connect
时开始发射项目,而不是在订阅时。通过调用
publish
将您的
observeOne
转换为
connectableobserveable
。然后设置所有订阅服务器。然后调用
observeOne
上的
connect

ConnectableObservable<String> observableOne = Observable
        .just("{1}")
        .map(v -> {
          System.out.println("Executing Observable 1");
          return v;
        }).publish();

    Observable<String> observableTwo = observableOne
        .map(observableOneValue -> {
          System.out.println("Executing Observable 2");
          return "{2"+observableOneValue+"}";
        });

    Observable.zip(
        observableOne,
        observableTwo,
        (observableOneValue, observableTwoValue) ->
        {
          System.out.println("Executing Observable 3");
          return "{3"+observableOneValue+observableTwoValue+"}";
        }
    ).subscribe(System.out::println);

    // Call when all the subscribers are ready --
    observableOne.connect();
ConnectableObservableOne=可观察
.just(“{1}”)
.map(v->{
System.out.println(“执行可观察1”);
返回v;
}).publish();
可观察到的可观察到的
.map(observableOneValue->{
System.out.println(“执行可观察2”);
返回“{2”+observeOnEvalue+”}”;
});
可观察的.zip(
可见的,
所以,,
(observeToEvalue,observeToEvalue)->
{
System.out.println(“执行可观察3”);
返回“{3”+observeToEvalue+observeToEvalue+“}”;
}
).subscribe(System.out::println);
//当所有订户都准备好时呼叫--
connect();
注释

  • observeOne
    现在是一个
    connectableobserveable
  • 需要使用
    subscribe
    而不是
    blockingSubscribe
    ,这样代码将执行
    connect
    调用

请参阅中的相关章节。