java - Akka Stream 中的物化值是如何工作的
问题描述
我了解到,当我运行 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
andrun
返回 的物化值Sink
,因为runWith
是使用的简写方式Keep.right()
。
从文档中:
final CompletionStage<Integer> sum = tweets.map(t -> 1).runWith(sumSink, system);
runWith()
是一种方便的方法,它自动忽略任何其他运算符的具体化值,除了由runWith()
自身附加的那些。在上面的示例中,它转换为Keep.right
用作物化值的组合器。
推荐阅读
- sql-server - 为什么表上的聚集索引扫描的执行次数为 8?
- ios - 如果我有超过 20 个配置,Xcode 在滚动构建设置时会挂起
- c# - Web API 2:文件响应作为 Json 序列化的 HttpResponseMessage 返回
- geometry - 从贝塞尔曲线到点的垂直线
- javascript - history.pushState URL 与 jquery 加载的交互导致页面获取失败?
- algorithm - 存在哪些算法可以使用特定函数从数组的一个顺序转到另一个顺序?
- tomcat9 - 仅在主机中传递冒号时,Tomcat服务器失败
- ios - 将 JSON 转换为字符串数组
- node.js - 带有 mysql 承诺的 Node.JS
- python - 从 python Gtk 列表中选择一个选项并将其存储在一个变量中