2016-03-05 66 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