Source <Out,Mat>的类型参数是什么意思?

Eri*_*rix 5 scala akka akka-stream

我正在尝试理解这里指定的Akka流的Source类型.

不幸的是,我发现的文档和示例并没有解释每个类型参数的实际含义.我猜这Out是源在物化时发出的类型.那是对的吗?什么是其他类型参数Mat

Ste*_*tti 6

退房

你是对的,这是由它发出的元素的类型Source.

这是Source物化的类型.请注意,每个阶段(Flows,Sinks等)也将实现一个值.这基本上是舞台本身运行的副产品.

您可以将其描绘为在舞台运行时与舞台交互的手段.查看SourceAkka提供的现成品的例子是获得它的要点的好方法.

  • Source.single将实现NotUsed.你没有意义与源相互作用,因为它只会产生一个元素,然后完成.

  • Source.queue将实现一个SourceQueue.这是一个更有趣的案例,因为您可以offer通过消息与源进行交互.您offer将从源发出的消息.

  • Source.maybe将实现一个Promise.您可以使用它Promise来控制源并使其发出一个元素,或None.

当您连接不同的阶段时,请注意每个阶段都可能具有有用的物化价值.您可以使用viaMat/ toMatKeepDSL 选择要保留的内容.run()在组合图上调用时,将返回一个或多个具体化值.

查看下面示例中的类型是获取API要点的最佳方法:

  val source: Source[Int, MatSrc]
  val sink: Sink[Int, MatSnk]

  val matSrc: MatSrc = source.toMat(sink)(Keep.left).run()
  val matSnk: MatSnk = source.toMat(sink)(Keep.right).run()
  val (m1: MatSrc, m2: MatSnk) = source.toMat(sink)(Keep.both).run()
  val n: NotUsed = source.toMat(sink)(Keep.none).run()
Run Code Online (Sandbox Code Playgroud)

请注意,在许多示例中您可以找到的更简洁的DSL实际上是上述的快捷方式,其中仅保留最后一级(例如接收器)的具体化值.

  val mat3: Mat3 = source.viaMat(flow)(Keep.right).toMat(sink)(Keep.right).run()
Run Code Online (Sandbox Code Playgroud)

是相同的

  val mat3: Mat3 = source.via(flow).runWith(sink)
Run Code Online (Sandbox Code Playgroud)

请参阅下面的文档以进一步阅读.

http://doc.akka.io/docs/akka/2.4/java/stream/stream-quickstart.html#Materialized_values