RxJava中相当于Flatmap运算符的Akka流

时间:2019-05-14 14:50:03

标签: akka rx-java akka-stream

我有RxJava的背景知识,现在开始使用Akka Streams。
当我需要使用RxJava中的第一个流的结果来组成一个流时,我通常会执行以下操作:

val fooBarObserable = fooObservable.flatmap { foo ->
   return barObservable.map { bar -> someOperation (foo, bar) }
}

在此示例中,fooObservable发出Foo类型,barObservable发出Bar类型,而fooBarObserable发出FooBar类型。

obs:

  1. Observable与Akka Streams中的Source非常相似。
  2. barObservable将是一个流

那么在Akka中组成这样的流的简单方法是什么?

2 个答案:

答案 0 :(得分:0)

您可以使用flatMapConcat,如下所示:


  final case class Foo(a: String)
  final case class Bar(a: String)

  val fooSource = Source(List(Foo("q-foo"), Foo("b-foo"), Foo("d-foo")))
  val barSource = Source(List(Bar("q-bar"), Bar("b-bar"), Bar("d-bar")))

  private val value: Source[String, NotUsed] = fooSource.flatMapConcat(foo => {
    barSource.map(bar => {
      foo.a + bar.a
    })
  })

运行此命令:value.runWith(Sink.foreach(println))将产生:

q-foo q-bar
q-foo b-bar
q-foo d-bar
b-foo q-bar
b-foo b-bar
b-foo d-bar
d-foo q-bar
d-foo b-bar
d-foo d-bar

答案 1 :(得分:0)

注意:我对RxJava不太熟悉,所以我可能会误解您所追求的语义。

由于流没有终止,因此您无法真正将其输出与fooSource.operation(barFlow)样式的源结合起来,因为那样将无法为您提供合理的阶段回溯图-您首先需要提供barSource,然后将barFlow与之结合。

尽管如此,您也可以用另一种方式编写它,例如:

val barFlow: Flow[Bar, Bar, NotUsed] = ???
val fooSource: Source[Foo, NotUsed] = ???

val fooToBarFooPairsFlow: Flow[Bar, (Bar, Foo), NotUsed] =
  barFlow.zip(fooSource)

哪个可以对foo和bar的值进行配对,让您以后使用barSource.via(fooToBarFooPairsFlow).map { case (bar, foo) => op(bar, foo) }

运行它