Java 如何组合测试可观察的<;可观察<;T>>;?

Java 如何组合测试可观察的<;可观察<;T>>;?,java,rx-java,rx-java2,Java,Rx Java,Rx Java2,我有一个可观察的c。我想将每个内部的可观察的组合成一个带有新行的字符串。结果应该是可观察的 有一个问题 下面是一个使用zip的实现: final Observable<String> d = Observable.zip(c, objects -> Arrays.stream(objects) .map(x -> (String)x) .collect(Collectors.joining("\n"))); 我应该如何实现这一点 例如,如果我有三个观测

我有一个
可观察的c
。我想将每个内部的
可观察的
组合成一个带有新行的
字符串。结果应该是可观察的

有一个问题

下面是一个使用
zip
的实现:

final Observable<String> d = Observable.zip(c, objects -> Arrays.stream(objects)
    .map(x -> (String)x)
    .collect(Collectors.joining("\n")));
我应该如何实现这一点


例如,如果我有三个观测值:

// a
Observable.just("Started", "0%", "5%", "10%", "20%", "40%", "95%", "100%", "Finished")

// b 
Observable.just("Started", "0%", "10%", "30%", "40%", "100%", "Finished")

// c
Observable.just("Started", "0%", "20%", "25%", "40%", "70%", "90%", "100%", "Finished")
那么我的
zip
解决方案的输出是:

---------------------
a: Started
b: Started
c: Started
---------------------
a: 0%
b: 0%
c: 0%
---------------------
a: 5%
b: 10%
c: 20%
---------------------
a: 10%
b: 30%
c: 25%
---------------------
a: 20%
b: 40%
c: 40%
---------------------
a: 40%
b: 100%
c: 70%
---------------------
a: 95%
b: Finished
c: 90%
但期望的输出类似于:

---------------------
a: Started
b: Started
c: Started
---------------------
a: 0%
b: 0%
c: 0%
---------------------
a: 5%
b: 10%
c: 20%
---------------------
a: 10%
b: 30%
c: 25%
---------------------
a: 20%
b: 40%
c: 40%
---------------------
a: 40%
b: 100%
c: 70%
---------------------
a: 95%
b: Finished
c: 90%
---------------------
a: 100%
b: Finished
c: 100%
---------------------
a: Finished
b: Finished
c: Finished
使用RxJava2(和java8)

使用RxJava

c.toList().flatMap(t -> 
                  Observable.combineLatest(t, 
                                           objects -> Arrays.stream(objects)
                                                            .map(x -> (String)x).collect(Collectors.joining("\n"))));

我怀疑它是否能完全做到你想要的,因为它完全有可能“跳过”排放,但这就是
combinerelatest
的工作方式。

这似乎是以错误的方式加入的。在我的
zip
版本中,每个内部观察对象在每个结果元素中都有一行。在这个版本中,每个结果元素都有一个内部观察值的所有行。您可以添加一个输入示例和您希望输出的内容吗?这似乎不起作用-第一个输出仅在前两个观察值完成后显示:
a:Finished b:Finished c:Started
它按照您的要求执行,但就像我说的那样可能不会做你想做的事。
c.toList().toObservable()
          .flatMap(t -> 
                  Observable.combineLatest(t, 
                                           objects -> Arrays.stream(objects)
                                                            .map(x ->(String)x).collect(Collectors.joining("\n"))))
c.toList().flatMap(t -> 
                  Observable.combineLatest(t, 
                                           objects -> Arrays.stream(objects)
                                                            .map(x -> (String)x).collect(Collectors.joining("\n"))));