Akka stream Akka溪流的Via/ViaMat/to/toMat
有人能解释清楚这4种方法之间的区别吗?什么时候使用每一个更合适?一般来说,这组方法的名称是什么?有更多的方法可以做同样的工作吗?scaladoc的链接也会有所帮助Akka stream Akka溪流的Via/ViaMat/to/toMat,akka-stream,Akka Stream,有人能解释清楚这4种方法之间的区别吗?什么时候使用每一个更合适?一般来说,这组方法的名称是什么?有更多的方法可以做同样的工作吗?scaladoc的链接也会有所帮助 -D-所有这些方法都是将两个流连接成一个流所必需的。例如,您可以使用源和流创建源,也可以使用流和汇创建汇,或者您可以使用两个流创建流 为此,有两个基本操作,到和通过执行。前者允许将源或流连接到接收器,而后者允许将源或流连接到流: source.to(sink) -> runnable graph flow.to(sink)
-D-所有这些方法都是将两个流连接成一个流所必需的。例如,您可以使用
源
和流
创建源
,也可以使用流
和汇
创建汇
,或者您可以使用两个流
创建流
为此,有两个基本操作,到
和通过
执行。前者允许将源
或流
连接到接收器
,而后者允许将源
或流
连接到流
:
source.to(sink) -> runnable graph
flow.to(sink) -> sink
source.via(flow) -> source
flow1.via(flow2) -> flow
作为参考,可运行图是一个完全连接的反应流,可以被物化和执行
各种操作的*Mat
版本允许指定如何组合操作中包含的流的物化值。您可能知道,每个流都有一个物化值,当流物化时可以获得该值。例如,Source.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
方法的变体。它们允许您指定组合函数,该函数接受两个操作数的物化值并返回组合流的物化值:
source.to(sink) equivalent to source.toMat(sink)(Keep.left)
flow1.via(flow2) equivalent to flow1.viaMat(flow2)(Keep.left)
例如,要保留两个物化值,可以使用keep.both
方法,或者如果只需要“right”操作数的mat.value,则可以使用keep.right
方法:
source.toMat(sink)(Keep.both) yields a tuple (mat.value of source, mat.value of sink)
这是一个很好的答案,非常简洁!同时,我只想澄清一点。我觉得很奇怪,默认的as在source.to(sink)中保留了source值(左)。如果水槽是折叠的,我相信我会对折叠的结果感兴趣。在这种情况下,唯一的方法是使用toMat。实际上,我只是看不到默认值是使用左值,而最常见的用例是继续使用右值。也许你可以就此发表一些评论。我可能没有正确的想法。@MaatDeamon,我不知道确切的原因,但这可能与以下事实有关:所有这些操作都是在源代码和流的超级特性中实现的,因此,对流
s有意义的某些操作的某些参数可能对源
s没有意义,反之亦然。这是一个很好的答案,但某些术语不正确。像“所有这些方法都是将两个流连接成一个流所必需的”应该是“sll这些方法是将两个流操作符连接成一个流操作符所必需的”。“每个流都有一个物化值”应该是“每个流操作符都有一个物化值”。原因是,源、流、汇只是一个操作符,它们构成了最终的流。这并不能回答这个问题。一旦你有足够的钱,你将能够;相反-