【发布时间】:2023-03-31 16:09:02
【问题描述】:
我正在通过在内部构建图表来制作自定义水槽。这是我的代码的广泛简化,以证明我的问题:
def mySink: Sink[Int, Unit] = Sink() { implicit builder =>
val entrance = builder.add(Flow[Int].buffer(500, OverflowStrategy.backpressure))
val toString = builder.add(Flow[Int, String, Unit].map(_.toString))
val printSink = builder.add(Sink.foreach(elem => println(elem)))
builder.addEdge(entrance.out, toString.in)
builder.addEdge(toString.out, printSink.in)
entrance.in
}
我遇到的问题是,虽然创建具有相同输入/输出类型且只有一个类型参数且没有值参数的 Flow 是有效的,例如:Flow[Int](在整个文档中)它是只提供两个类型参数和零值参数是无效的。
根据reference documentation for the Flow object apply 我正在寻找的方法定义为
def apply[I, O]()(block: (Builder[Unit]) ⇒ (Inlet[I], Outlet[O])): Flow[I, O, Unit]
说
通过将 FlowGraph.Builder 传递给给定的创建函数来创建流。
create 函数应返回一对 Inlet 和 Outlet,它们对应于创建的 Flows 输入和输出端口。
当我试图创建一个我认为非常简单的流程时,我似乎需要处理另一个级别的图形构建器。有没有一种更简单、更简洁的方法来创建一个 Flow 来改变它的输入和输出的类型,而不需要弄乱它的内部端口?如果这是解决此问题的正确方法,那么解决方案应该是什么样的?
奖励:为什么创建一个不改变其输入类型与输出类型的 Flow 很容易?
【问题讨论】:
-
“只提供两个类型参数和零值参数是无效的” 这种流的语义是什么?您是否正在考虑更短的
Flow[Int].map(_.toString)? -
我的理解是
Flow[Int].map(_.toString)是无效的,因为Flow[Int]表示从Int到Int的流。但是,您的地图函数 (_.toString) 的类型是Int => String。这是不正确的吗? (您的评论和用新鲜的眼光看文档让我怀疑我不正确)
标签: akka-stream