我了解到,当我运行Akka流图时,它将实现最正确的组件。
但是这样做:
Source.range(1,100).to(Sink.reduce((a,b) -> a+b)).run(materializer);
尽管最左边的部分是返回整数的接收器,但将实现
NotUsed
。但是,对
runWith
进行相同操作可以正常工作:Source.range(1, 100).runWith(Sink.reduce((a, b) -> a + b), materializer)
.thenAccept(value -> LOGGER.info("The final value is {}", value));
对
run
方法我不太了解的是什么? 最佳答案
默认情况下,to
保留调用该方法的流运算符的物化值。在你的例子中...
Source.range(1, 100).to(Sink.reduce((a, b) -> a + b)).run(materializer);
// ^
...
Source
调用to
,因此在流上调用run
返回Source
的物化值,即NotUsed
,而忽略Sink
的物化值。这等效于运行source.toMat(sink, Keep.left())
。相反,在这种情况下,调用
runWith
而不是to
和run
会返回Sink
的物化值,因为runWith
是使用Keep.right()
的简便方法。从documentation:
final CompletionStage<Integer> sum = tweets.map(t -> 1).runWith(sumSink, system);
runWith()
是一种便捷的方法,它会自动忽略除runWith()
本身附加的运算符之外的任何其他运算符的物化值。在上面的示例中,它转换为使用Keep.right
作为实现值的组合器。关于java - 物化值(value)如何在Akka Stream中发挥作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60130604/