2016-03-05 70 views
13

我想了解什么toMat在阿克卡流。例如:akka流toMat

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的VS通过?
  2. Mat在viaMat和toMat之间做了什么?
  3. keep.both的用途是什么,这是否意味着如果是的话,我可以从之前和当前的物品中获得价值,那么我该如何获得这些价值。

感谢 阿伦

+0

它应该返回如下(保留两个MAT)VAL可运行:RunnableGraph [(无极[选项[INT]],未来[ Int])] =源(1到10).viaMat(流)(Keep.right).toMat(sink1)(Keep.both).run() – ASe

回答

12
  1. 通过只是为viaMat(...)(Keep.left)的快捷方式,而事实上,这是它是如何实现的:override def via[T, Mat2](flow: Graph[FlowShape[Out, T], Mat2]): Repr[T] = viaMat(flow)(Keep.left)

  2. 托马特与viaMat相同,但是对于接收器,它允许您从左侧(源/流)或右侧(接收器)侧或两者都保留物化值。Keep.both只是一个al对于(a:A,b:B) => (a, b),这是一个函数,它接受两个输入参数并将它们作为元组返回。它被用来将两个流时,有左边和右边两者的物化价值(或源和流动或流动,水池等)

我会仔细分析你的代码行:

// 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) 

当您加入流的两个部分(即源和流/汇或流和汇)时,它们中的每一个都具有您在运行流时获得的物化值。与via/to结合使用时的默认行为是保持左侧。如果你使用viaMat/toMat,你可以选择保留正确的物化值或两者都是元组。

+0

谢谢。我无法理解物化价值,我知道源只有一个输出,只能输入一个输入,这里的Mat是什么?下面 代码想回到我的元组正确的......你可以帮我,我怎么能打印这些: VAL源1 =源(1〜10) VAL水槽:水槽[诠释,未来[INT]] = Sink.fold [Int,Int](0)(_ + _) val runnableGraph = source1.toMat(sink)(Keep.both) val x = runnableGraph.run() – ASe

+0

物化值是您得到的当你做runnableGraph.run()。例如,如果使用Sink.fold,则它是包含折叠结果的未来。阅读:http://doc.akka.io/docs/akka/2.4.2/general/stream/stream-design.html –

+0

非常感谢。 我从 读取物化值http://doc.akka.io/docs/akka-stream-and-http-experimental/2.0.3/scala/stream-quickstart.html#materialized-values 如果我理解正确 - Source [+ Out,+ Mat],Flow [-In,+ Out,+ Mat]和Sink [-In,+ Mat]上的Mat类型参数是运行时间。 – ASe