我正在尝试构建一个简单的流程,其中包含一个源,一个接收器和两个“流”。像
这样的东西FlowGraph.closed() { builder: FlowGraph.Builder[Unit] =>
val in = Source(1 to 10)
val out = Sink.ignore
val f1 = Flow[Int].map(_ + 1)
val f2 = Flow[Int].map(_ + 2)
builder.addEdge(builder.add(in), f1, builder.add(out))
// builder.addEdge(builder.add(in), f1, f2, builder.add(out)) // does not compile
}.run
注释行不会编译,但会演示我想要实现的目标。
这个例子的设计是因为定义一个增加3的新函数或组合函数同样容易,但实际上函数要复杂得多,而且为简单起见而分开。
我不想在这里做扇出或扇入,只是一个直接的流程,我可以在它们之间有任意数量的功能。
感谢。
答案 0 :(得分:2)
via
上的Flow
方法应该做您想做的事情(即f1 via f2
)。
请参阅scaladocs。
请注意,您也可以
val f = Flow[Int].
map(_ + 1).
map(_ + 2)
如果你想保持分离。或者,如果您将功能提取为g1
和g2
,则还可以
val g1 = (i: Int) => i + 1
val g2 = (i: Int) => i + 2
val f = Flow[Int].map(g1 andThen g2)
一般情况下,我建议尽可能多地使用函数,并在真正需要时节省流量。
答案 1 :(得分:1)
这里的问题是你需要一个FlowShape。
你有2种方法可以使用addEdge:
def addEdge[A, B, M2](from: Outlet[A], via: Graph[FlowShape[A, B], M2], to: Inlet[B]): Unit
和
def addEdge[T](from: Outlet[T], to: Inlet[T]): Unit
要使用构建器执行您想要执行的操作,您可以创建2个FlowShape并使用from: Outlet[T], to: Inlet[T]
连接它们。
FlowGraph.closed() { builder: FlowGraph.Builder[Unit] =>
val in = Source(1 to 10)
val out = Sink.foreach(println)
// val f1: Flow[Int, Int, Unit] = Flow[Int].map(_ + 1)
// val f2: Flow[Int, Int, Unit] = Flow[Int].map(_ + 2)
val f1: FlowShape[Int, Int] = builder.add(Flow[Int].map(_ + 1))
val f2: FlowShape[Int, Int] = builder.add(Flow[Int].map(_ + 2))
builder.addEdge(builder.add(in), f1.inlet) //Source to f1 in
builder.addEdge(f1.outlet, f2.inlet) // f1 out to f2 in
builder.addEdge(f2.outlet, builder.add(out)) // f2 out to sink
}.run()
我离开了这些类型,所以你可以看到差异。
执行此操作的第二个选项是使用部分图形创建FlowShape。
val partialFlow: Graph[FlowShape[Int, Int], Unit] = FlowGraph.partial() { builder =>
val f1 = builder.add(Flow[Int].map(_ + 1))
val f2 = builder.add(Flow[Int].map(_ + 2))
builder.addEdge(f1.outlet, f2.inlet)
FlowShape(f1.inlet, f2.outlet)
}
FlowGraph.closed() { builder: FlowGraph.Builder[Unit] =>
val in = Source(1 to 10)
val out = Sink.foreach(println)
builder.addEdge(builder.add(in), partialFlow, builder.add(out))
}.run()