【问题标题】:RxJava zip with vararg observablesRxJava zip 和可变参数 observables
【发布时间】:2015-05-11 14:10:26
【问题描述】:

当我们确切知道有多少 observables 以及它们的确切类型并且我们想要压缩时,我们会这样做

Observable<String> data1 = Observable.just("one", "two", "three", "four", "five");
Observable<String> data2 = Observable.just("one", "two", "three", "four", "five");
Observable<String> data3 = Observable.just("one", "two", "three", "four", "five");

Observable.zip(data1, data2, data3, (a, b, c) -> a + b + c);

我们使用带有 3 个参数的固定参数函数式接口......在这种情况下它可以正常工作。

但是如果我们知道我们有 N 个 Observable&lt;T&gt; 其中T 是相同的类型,我们如何压缩它?消费者功能可能需要T...

但我没有看到任何方法来实现这个......

更新

我在这里尝试解决的实际问题是我有一些Observable&lt;T&gt;,我想分叉加入这些并最终只选择了一个T 来发出...

想象几个发出 T 的 observables,我想拿它们比较,然后只发出一个与其他一些 observables...

解决方案

正如回答中所说,有一个带有可迭代和函数的 zip,示例代码如下所示

Observable<String> data1 = Observable.just("one", "two", "three", "four", "five");
Observable<String> data2 = Observable.just("one", "two", "three", "four", "five");
Observable<String> data3 = Observable.just("one", "two", "three", "four", "five");
List<Observable<String>> iter = Arrays.asList(data1, data2, data3);

Observable.zip(iter, args1 -> args1).subscribe((arg)->{
  for (Object o : arg) {
    System.out.println(o);
  }
});

这将产生

one
one
one
two
two
two
three
three
three
four
four
four
five
five
five

【问题讨论】:

    标签: java reactive-programming rx-java


    【解决方案1】:

    有一个采用 Iterable 的 zip 方法。这将允许使用 n 个 Observables。

    【讨论】:

    • 有没有办法按时间限制 zip?例如,如果前两个发出的值但超过一秒,它会丢弃当前的 zip 并等待另一批值...?简而言之,确保所有到达的值都在某个特定的时间范围内......
    • @vach 这是一个有趣的问题,你有没有发现这是否可行?
    • 不,但我通常自己编写自定义运算符并使用 kotlin 的扩展函数使其成为 Observable 的一部分,以便可以像在库中一样使用它们:)
    猜你喜欢
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    • 2019-10-21
    • 2017-09-07
    • 1970-01-01
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多