我了解到,当我运行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而不是torun会返回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/

10-09 03:09