我有RxJava的背景知识,现在开始使用Akka Streams。
当我需要使用RxJava中的第一个流的结果来组成一个流时,我通常会执行以下操作:
val fooBarObserable = fooObservable.flatmap { foo ->
return barObservable.map { bar -> someOperation (foo, bar) }
}
在此示例中,fooObservable
发出Foo
类型,barObservable
发出Bar
类型,而fooBarObserable发出FooBar
类型。
obs:
Source
非常相似。那么在Akka中组成这样的流的简单方法是什么?
答案 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) }