Scala 循环组合观测值

Scala 循环组合观测值,scala,rx-java,Scala,Rx Java,我是RxJava新手,我一直在尝试以循环方式组合多个观测值 那么,假设你有三个可观察的物体: o1: --0---1------2-- o2: -4--56---------- o3: -------8---9---- 以循环的方式将它们结合在一起,可以得到如下结果: r : --04---815-9-26- 最好的方法是什么? 因为它看起来像RxJava、RxScala等,几乎都是共享API,所以用任何语言回答都可以 谢谢, MatijaRxJava默认情况下没有这样的操作符。最接近的方法

我是RxJava新手,我一直在尝试以循环方式组合多个观测值

那么,假设你有三个可观察的物体:

o1: --0---1------2--
o2: -4--56----------
o3: -------8---9----
以循环的方式将它们结合在一起,可以得到如下结果:

r : --04---815-9-26-
最好的方法是什么? 因为它看起来像RxJava、RxScala等,几乎都是共享API,所以用任何语言回答都可以

谢谢,
Matija

RxJava默认情况下没有这样的操作符。最接近的方法是使用merge和节奏良好的源代码,因为它使用循环来收集值,但不能依赖此属性。为什么需要这种循环行为


最好的办法是手动实现此行为。没有背压支持。

RxJava默认情况下没有这样的操作符。最接近的方法是使用merge和节奏良好的源代码,因为它使用循环来收集值,但不能依赖此属性。为什么需要这种循环行为


最好的办法是手动实现此行为。无需背压支持。

有一种方法实现起来非常简单,几乎完全符合您的要求-只需压缩三个源观测值,然后在每次新的三元组到达时从压缩的观测值中发出三个值

翻译成RxScala

val o1=可观察的。仅1,2,3 val o2=可观察到。仅10,20,30 val o3=可观察。仅100、200、300 val roundRobinSource=可观测 .zipObservable.justo1,o2,o3 .flatMapObservable.from[Int] roundRobinSource.subscribeprintln,println 给你

1
10
100
2
20
200
3
30
300
这正是你想要的

这种方法的问题是,它会一直阻塞,直到三个源中的每一个都到达一个值,但是如果您对此保持冷静,我认为这是迄今为止最简单的解决方案。我很好奇,你的用例是什么

更新,拍2张 这其实是一个有趣的问题。这是另一个例子,可以用一个退税换另一个

导入rx.lang.scala.{Subject,Observable} val s1=受试者[Int] val s2=受试者[Int] val s3=受试者[Int] val roundRobinSource3=s1.publishpo1⇒ s2.publishpo2⇒ s3.publishpo3⇒ { def oneRound:Observable[Int]=po1.take1++po2.take1++po3.take1 def all:Observable[Int]=oneRound++Observable.all 全部的 } roundRobinSource3.subscribeprintln,println,⇒ 打印完成 printlns1.onNext1 s1.onNext1 printlns2.onNext10 s2.10 printlns3.onNext100 s3.onNext100 printlns2.onNext20 s2.onNext20 printlns1.onNext2 s1.onNext2 printlns3.onNext200 s3.onNext200 printlns1.onCompleted s1.未完成 printlns2.onCompleted s2.未完成 printlns3.onCompleted s3.未完成 打印完成。。。 给你

s1.onNext(1)
1
s2.onNext(10)
10
s3.onNext(100)
100
s2.onNext(20)
s1.onNext(2)
2
20
s3.onNext(200)
200
s1.onCompleted()
s2.onCompleted()
s3.onCompleted()
Done...
它不阻挡,它围着知更鸟,但是。。。它也不完整:如果您需要,您可以使用taketill、Subject和doOnComplete以有状态的方式完成它

至于机制,它使用了某种神秘的发布行为来跟踪已经发出的东西。当@lopar回答我自己的问题时,他最初指给我看


发布的行为实际上对我来说是一个谜,我在这里发布了一个关于它的问题:。如果你好奇的话,你可以遵循它。

有一种方法非常容易实现,并且几乎完全符合你的要求——只需压缩三个源观测值,然后在每次新的三元组到达时从压缩的观测值发出三个值

翻译成RxScala

val o1=可观察的。仅1,2,3 val o2=可观察到。仅10,20,30 val o3=可观察。仅100、200、300 val roundRobinSource=可观测 .zipObservable.justo1,o2,o3 .flatMapObservable.from[Int] roundRobinSource.subscribeprintln,println 给你

1
10
100
2
20
200
3
30
300
这正是你想要的

这种方法的问题是,它会一直阻塞,直到三个源中的每一个都到达一个值,但是如果您对此保持冷静,我认为这是迄今为止最简单的解决方案。我很好奇,你的用例是什么

更新,拍2张 这其实是一个有趣的问题。这是另一个例子,可以用一个退税换另一个

导入rx.lang.scala.{Subject,Observable} val s1=受试者[Int] val s2=受试者[Int] val s3=受试者[Int] val roundRobinSource3=s1.publishpo1⇒ s2.publishpo2⇒ s3.publishpo3⇒ { def oneRound:Observable[Int]=po1.take1++po2.take1++po3.take1 def all:Observable[Int]=oneRound++Observable.all 全部的 } roundRobinSource3.subscribeprintln,println,⇒ 打印完成 printlns1.onNext1 s1.onNext1 printlns2.onNext10 s2.10 printlns3.onNext100 s3.onNext100 printlns2.onNext20 s2.onNext20 printlns1.onNext2 s1.onNext2 printlns3.onNext200 s3.onNext200 printlns1.onCompleted s1.未完成 printlns2.onCompleted s2.未完成 printlns3.onCompleted s3.未完成 打印完成。。。 给你

s1.onNext(1)
1
s2.onNext(10)
10
s3.onNext(100)
100
s2.onNext(20)
s1.onNext(2)
2
20
s3.onNext(200)
200
s1.onCompleted()
s2.onCompleted()
s3.onCompleted()
Done...
它不阻挡,它围着知更鸟,但是。。。它也不完整:你 如果你需要的话,可以使用takeUntil、Subject和doOnComplete以有状态的方式完成

至于机制,它使用了某种神秘的发布行为来跟踪已经发出的东西。当@lopar回答我自己的问题时,他最初指给我看


发布的行为实际上对我来说是一个谜,我在这里发布了一个关于它的问题:。如果你好奇,你可以跟随它。

看起来棒极了!在写了这个问题之后,我的方法是将Observable转换为BlockingObservable,然后从BlockingObservable创建迭代器,所有这些都已经在RxJava中实现了。这似乎创建了一个迭代器,该迭代器将阻塞直到有可用的元素。除了错误处理之外,这种方法不好的原因是什么。在我看来,主要原因可能是它与反应式编程范式完全相反?但是,我猜应该可以创建Observable,它从所有主题创建迭代器,并循环使用它们?你的方法不必要地阻塞了源代码。很长一段时间,但是你能想象为什么如果我有4个Observable,而我合并了1个,这不起作用吗。二,。与合并循环,和3。四,。与合并循环同时进行。看起来,在某个时刻,InputSubscriberonNext不会被调用,即使Observable获得了一个新值——我正在打印它?可能会有一些我没有预料到的丢失通知或状态。你能发布一个单元测试来证明这一点吗?看起来棒极了!在写了这个问题之后,我的方法是将Observable转换为BlockingObservable,然后从BlockingObservable创建迭代器,所有这些都已经在RxJava中实现了。这似乎创建了一个迭代器,该迭代器将阻塞直到有可用的元素。除了错误处理之外,这种方法不好的原因是什么。在我看来,主要原因可能是它与反应式编程范式完全相反?但是,我猜应该可以创建Observable,它从所有主题创建迭代器,并循环使用它们?你的方法不必要地阻塞了源代码。很长一段时间,但是你能想象为什么如果我有4个Observable,而我合并了1个,这不起作用吗。二,。与合并循环,和3。四,。与合并循环同时进行。看起来,在某个时刻,InputSubscriberonNext不会被调用,即使Observable获得了一个新值——我正在打印它?可能会有一些我没有预料到的丢失通知或状态。你能发布一个单元测试来证明这一点吗?是的,正如你所说,它会一直阻塞,直到所有的值都从所有三个来源到达,这不适合我的情况。尽管如此,我还是会给你一张赞成票,因为我没有明确提到这一点。至于用例,我有一个过程的stdout和stdin的Observable和Subject的组合,我使用第x个过程的输出来计算第x+1个过程的输入。Matija,我不确定答案更新时是否会通知您,因此这个评论-我找到了解决您问题的另一种方法,您可以看看。顺便说一句,你能扩展一下你的用例吗?是的,正如你所说的,它会阻塞,直到所有三个来源的值都到达,这不适合我的情况。尽管如此,我还是会给你一张赞成票,因为我没有明确提到这一点。至于用例,我有一个过程的stdout和stdin的Observable和Subject的组合,我使用第x个过程的输出来计算第x+1个过程的输入。Matija,我不确定答案更新时是否会通知您,因此这个评论-我找到了解决您问题的另一种方法,您可以看看。顺便说一句,你能详细介绍一下你的用例吗?