Via/ViaMat/to/toMat 在 Akka 流中
Via/ViaMat/to/toMat in Akka Stream
谁能解释清楚这4种方法有什么区别?什么时候使用每一个更合适?另外一般来说这组方法的名称是什么?是否有更多方法可以完成同样的工作?对 scaladoc 的 link 也有帮助。
-D-
所有这些方法都是将两个流合并为一个流所必需的。例如,您可以从 Source
和 Flow
创建 Source
,或者您可以从 Flow
和 [=] 创建 Sink
17=],或者您可以从两个 Flow
中创建一个 Flow
。
为此,有两个基本操作,to
和via
。前者允许将 Source
或 Flow
连接到 Sink
,而后者允许将 Source
或 Flow
连接到 Flow
:
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
方法变体的时候。它们允许您指定组合函数,该函数采用两个操作数的物化值和 returns 组合流的物化值:
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)
谁能解释清楚这4种方法有什么区别?什么时候使用每一个更合适?另外一般来说这组方法的名称是什么?是否有更多方法可以完成同样的工作?对 scaladoc 的 link 也有帮助。
-D-
所有这些方法都是将两个流合并为一个流所必需的。例如,您可以从 Source
和 Flow
创建 Source
,或者您可以从 Flow
和 [=] 创建 Sink
17=],或者您可以从两个 Flow
中创建一个 Flow
。
为此,有两个基本操作,to
和via
。前者允许将 Source
或 Flow
连接到 Sink
,而后者允许将 Source
或 Flow
连接到 Flow
:
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
方法变体的时候。它们允许您指定组合函数,该函数采用两个操作数的物化值和 returns 组合流的物化值:
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)