通过/ ViaMat / to / toMat在Akka Stream

时间:2016-06-19 19:46:09

标签: akka-stream

有人可以清楚地解释这4种方法之间的区别吗?何时使用每一个更合适?一般来说这组方法的名称是什么?有更多方法可以完成同样的工作吗?链接到scaladoc也可以提供帮助。

-D -

1 个答案:

答案 0 :(得分:44)

将两个流连接到一个流中需要所有这些方法。例如,您可以在SourceSource中创建Flow,也可以在Sink和{{{{}}中创建Flow 1}},或者您可以从两个Sink中创建Flow

为此,有两个基本操作Flowto。前者允许将viaSource连接到Flow,而后者允许将SinkSource连接到{{} {1}}:

Flow

作为参考,可运行图是完全连接的反应流,可以实现并执行。

各种操作的

Flow版本允许指定如何组合操作中包含的流的具体化值。如您所知,每个流都具有物化值,该值可在物流实现时获得。例如,source.to(sink) -> runnable graph flow.to(sink) -> sink source.via(flow) -> source flow1.via(flow2) -> flow 生成一个队列对象,程序的另一部分可以使用该队列对象将元素发送到正在运行的流中。

默认情况下,*MatSource.queue在源和流上只保留调用它的流的具体化值,忽略其参数的具体化值:

to

但是,有时候,您需要保留两个物化值或以某种方式组合它们。那是需要via方法变体的时候。它们允许您指定组合函数,该函数获取两个操作数的实现值并返回组合流的实现值:

source.to(sink)    yields   mat.value of source
source.via(flow)   yields   mat.value of source

flow.to(sink)      yields   mat.value of flow
flow1.via(flow2)   yields   mat.value of flow1

例如,要保留两个具体化值,可以使用Mat方法,或者如果只需要“右”操作数的mat.value,则可以使用source.to(sink) equivalent to source.toMat(sink)(Keep.left) flow1.via(flow2) equivalent to flow1.viaMat(flow2)(Keep.left) 方法:

Keep.both