作为流 toMat

akka stream toMat

我想了解 toMat 在 akka 流中的作用。例如:

val sink1:Sink[Int, Future[Int]]=Sink.fold[Int,Int](0)(_ + _)

val flow=Flow[Int].fold[Int](0){(x,y)=> x+y}

val runnable = Source (1 to 10).viaMat(flow)(Keep.right).toMat(sink1)(Keep.both)
  1. viaMat 和 via 有什么用?
  2. toMat 在 vi​​aMat 和 toMat 之间做什么?
  3. keep.both 的用途是什么,这是否意味着我可以从以前和当前的价值中具体化,如果是,那么我如何才能取回这些价值。

谢谢 阿伦

  1. via只是viaMat(...)(Keep.left)的一个快捷方式,实际上是这样实现的:override def via[T, Mat2](flow: Graph[FlowShape[Out, T], Mat2]): Repr[T] = viaMat(flow)(Keep.left)

  2. toMat 与 viaMat 相同,但对于接收器,它允许您保留左侧 (source/flow) 或右侧 (接收器) 或两者的物化值

  3. Keep.both 只是 (a:A,b:B) => (a, b) 的别名,它是一个将两个输入参数和 return 作为元组的函数。它用于在组合两个流(或源和流或流和汇等)时具有左侧和右侧的物化值

我将剖析你的代码行:

// you're keeping the materialized value of flow
val source2 = Source (1 to 10).viaMat(flow)(Keep.right)
// you're keeping both materialized values, i.e. the one of flow from previous step
// and the one o sink.     
val runnableGraph = source2.toMat(sink)(Keep.both) 
runnableGraph.run() // returns a tuple (flowMatVal, sinkMatVal)

当您连接流的两个部分(即源和 flow/sink 或流和汇)时,每个部分都有一个物化值,您在 运行 流时获得该值。与 via/to 组合时的默认行为是保留左侧。如果您使用 viaMat/toMat,您可以选择将正确的具体化值或两者都保留为一个元组。

我可以从 akka 用户组获得一些细节

https://groups.google.com/forum/#!topic/akka-user/Ofnx_XzWrTU