gpt4 book ai didi

akka-stream - Akka Stream 中的 Via/ViaMat/to/toMat

转载 作者:行者123 更新时间:2023-12-03 12:25:41 25 4
gpt4 key购买 nike

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

-D-

最佳答案

所有这些方法都是将两个流合并为一个流所必需的。例如,您可以创建一个 SourceSourceFlow ,或者您可以创建一个 SinkFlowSink ,或者您可以创建一个 Flow两个Flow s。

为此,有两个基本操作,tovia .前者允许连接SourceFlowSink , 而后者允许连接 SourceFlowFlow :

source.to(sink)   ->  runnable graph
flow.to(sink) -> sink

source.via(flow) -> source
flow1.via(flow2) -> flow

作为引用,可运行图是一个完全连接的 react 流,可以被物化和执行。
*Mat各种操作的版本允许指定操作中包含的流的具体化值应如何组合。您可能知道,每个流都有一个物化值,可以在物化流时获得该值。例如, Source.queue产生一个队列对象,程序的另一部分可以使用该对象将元素发送到正在运行的流中。

默认 tovia在源和流上只保留它被调用的流的物化值,忽略其参数的物化值:
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方法,或者如果您只需要“正确”操作数的 mat.value,您可以使用 Keep.right方法:
source.toMat(sink)(Keep.both)   yields   a tuple (mat.value of source, mat.value of sink)

关于akka-stream - Akka Stream 中的 Via/ViaMat/to/toMat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37911174/

25 4 0