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)
ありがとうアルン
viaはviaMat(...)(Keep.left)のショートカットであり、実際には次のように実装されています。override def via[T, Mat2](flow: Graph[FlowShape[Out, T], Mat2]): Repr[T] = viaMat(flow)(Keep.left)
toMatはviaMatと同じですが、シンクの場合、マテリアライズされた値を左側(ソース/フロー)または右側(シンク)、あるいはその両方から保持できます。
Keep.bothは、(a:A,b:B) => (a, b)
の単なるエイリアスです。これは、2つの入力パラメーターを受け取り、それらをタプルとして返す関数です。これは、2つのフロー(またはソースとフローまたはフローとシンクなど)を組み合わせるときに、左側と右側の両方の実体化された値を持つために使用されます。
コードの行を分析します。
// 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)
フローの2つの部分(つまり、ソースとフロー/シンク、またはフローとシンク)を結合すると、それぞれに、フローを実行したときに得られる具体化された値があります。 via/toと組み合わせるときのデフォルトの動作は、左側を維持することです。 viaMat/toMatを使用する場合は、適切なマテリアライズ値またはその両方をタプルとして保持することを選択できます。
akka-userグループから取得できた詳細
https://groups.google.com/forum/#!topic/akka-user/Ofnx_XzWrT