我正在尝试理解Keep在Akka流中是如何工作的。阅读What does Keep in akka stream mean中的答案,我知道它有助于控制我们从物化器的左/右/两侧获得结果。但是,我仍然无法构建一个可以改变左/右的值并获得不同结果的示例。
例如,
implicit val system: ActorSystem = ActorSystem("Playground")
implicit val materializer: ActorMaterializer = ActorMaterializer()
val sentenceSource = Source(List(
"Materialized values are confusing me",
"I love streams",
"Left foo right bar"
))
val wordCounter = Flow[String].fold[Int](0)((currentWords, newSentence) => currentWords + newSentence.split(" ").length)
val result = sentenceSource.viaMat(wordCounter)(Keep.left).toMat(Sink.head)(Keep.right).run()
val res = Await.result(result, 2 second)
println(res)
在本例中,如果我将值从keep left更改为keep right,我仍然得到相同的结果。有人能提供一个基本示例,说明将keep更改为left/right/这两个值会导致不同的结果吗?
1条答案
按热度按时间q9yhzks01#
在您的示例中,由于:
两者都将
NotUsed
作为其物化(指示它们没有有用物化),但是,由于
Sink.head[T]
物化为Future[T]
,因此更改组合器显然会产生影响Source
中的大多数源实体化为NotUsed
,几乎所有常见的Flow
操作符也是如此,所以toMat(someSink)(Keep.right)
(或等价的.runWith(someSink)
)比使用Keep.left
或Keep.both
要普遍得多。源/流实体化最常见的用例是提供某种控制平面,例如:在本例中,我们使用
Keep.left
来传递sentenceSource
的物化值,然后使用Keep.both
来同时获得该物化值和Sink.head
的物化值。