我的流有一个Flow,其输出是List [Any]对象。我希望有一个mapAsync,后跟一些其他阶段,每个阶段处理一个单独的元素而不是列表。我怎么能这样做?
实际上我想连接
的输出Flow[Any].map { msg =>
someListDerivedFrom(msg)
}
被消费 -
Flow[Any].mapAsyncUnordered(4) { listElement =>
actorRef ? listElement
}.someOtherStuff
我该怎么做?
答案 0 :(得分:7)
我认为您正在寻找的组合子是mapConcat
。该组合器将接受输入参数并返回Iterable
的内容。一个简单的例子如下:
implicit val system = ActorSystem()
implicit val mater = ActorMaterializer()
val source = Source(List(List(1,2,3), List(4,5,6)))
val sink = Sink.foreach[Int](println)
val graph =
source.
mapConcat(identity).
to(sink)
graph.run
在这里,我的Source
正在吐出List
个元素,而我的Sink
接受List
个内容的基础类型。由于类型不同,我无法将它们直接连接在一起。但是如果我在它们之间应用mapConcat
,它们就可以连接起来,因为组合器会将这些List
元素展平,向下游发送它们各自的元素(Int
)。由于mapConcat
的输入元素已经是Iterable
,因此您只需使用identify
正文中的mapConcat
函数即可生效。