Scala 阿克卡河托马特酒店

Scala 阿克卡河托马特酒店,scala,akka,streaming,akka-stream,Scala,Akka,Streaming,Akka Stream,我试图理解在阿卡流媒体中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) viaMat vs via有什么用 托马特在维亚马特和托马特

我试图理解在阿卡流媒体中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)
  • viaMat vs via有什么用
  • 托马特在维亚马特和托马特之间做什么
  • keep.both的用途是什么?这是否意味着我可以从上一个和当前的值物化?如果是,那么我如何才能获得这些值
  • 谢谢 阿伦

  • via只是viaMat(…)(Keep.left)的一个快捷方式,事实上这就是它的实现方式:
    通过[T,Mat2]覆盖def(flow:Graph[FlowShape[Out,T],Mat2]):Repr[T]=viaMat(flow)(Keep.left)

  • toMat与viaMat相同,但对于接收器,它允许您从左侧(源/流)或右侧(接收器)或两者保留物化值

  • Keep.eath只是
    (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,您可以选择保留正确的物化值,或者将它们作为元组保存。

    我可以从akka用户组获得一些详细信息


    它应该按以下方式返回(保持两个Mat)val可运行:RunnableGraph[(Promise[Option[Int]],Future[Int])]=Source(1到10)。viaMat(flow)(Keep.right)。toMat(sink1)(Keep.tware)。run()谢谢。我不能理解具体化的值,我知道源正好是一个输出,而汇正好是一个输入,这里是什么?下面的代码假定返回正确的元组。。。你能帮我怎么打印吗:val source1=Source(1到10)val sink:sink[Int,Future[Int]]=sink.fold[Int,Int](0)(uu+)(uu)val runnableGraph=source1.toMat(sink)(Keep.both)val x=runnableGraph.run()具体化的值是你在运行nablegraph.run()时得到的值。例如,如果使用Sink.fold,则它是包含折叠结果的未来。读这个:非常感谢。如果我理解正确,我会从中读取物化值-源[+Out,+Mat],流[-In,+Out,+Mat]和汇[-In,+Mat]上的Mat类型参数是运行时。类型参数是编译时已知的。值本身是在运行时运行(也称为物化)流时创建的。你会接受这个答案吗P