Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Akka stream Akka溪流的Via/ViaMat/to/toMat_Akka Stream - Fatal编程技术网

Akka stream Akka溪流的Via/ViaMat/to/toMat

Akka stream Akka溪流的Via/ViaMat/to/toMat,akka-stream,Akka Stream,有人能解释清楚这4种方法之间的区别吗?什么时候使用每一个更合适?一般来说,这组方法的名称是什么?有更多的方法可以做同样的工作吗?scaladoc的链接也会有所帮助 -D-所有这些方法都是将两个流连接成一个流所必需的。例如,您可以使用源和流创建源,也可以使用流和汇创建汇,或者您可以使用两个流创建流 为此,有两个基本操作,到和通过执行。前者允许将源或流连接到接收器,而后者允许将源或流连接到流: source.to(sink) -> runnable graph flow.to(sink)

有人能解释清楚这4种方法之间的区别吗?什么时候使用每一个更合适?一般来说,这组方法的名称是什么?有更多的方法可以做同样的工作吗?scaladoc的链接也会有所帮助


-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这些方法是将两个流操作符连接成一个流操作符所必需的”。“每个流都有一个物化值”应该是“每个流操作符都有一个物化值”。原因是,源、流、汇只是一个操作符,它们构成了最终的流。这并不能回答这个问题。一旦你有足够的钱,你将能够;相反-