Поток Akka, эквивалентный оператору flatmap в RxJava - PullRequest
0 голосов
/ 14 мая 2019

У меня есть опыт работы в 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 очень похож на Source в Akka Streams.
  2. barObservable будет потоком

Так каков простой способ создать такой поток в Akka?

Ответы [ 2 ]

0 голосов
/ 15 мая 2019

Предостережение: я не совсем знаком с 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) }

0 голосов
/ 14 мая 2019

вы можете использовать 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
...