我很难理解Akka Streams中NotUsed
和Done
的目的和意义。
让我们看看以下两个简单的例子:
使用NotUsed:
implicit val system = ActorSystem("akka-streams")
implicit val materializer = ActorMaterializer()
val myStream: RunnableGraph[NotUsed] =
Source.single("stackoverflow")
.map(s => s.toUpperCase())
.to(Sink.foreach(println))
val runResult:NotUsed = myStream.run()
使用完成
implicit val system = ActorSystem("akka-streams")
implicit val materializer = ActorMaterializer()
val myStream: RunnableGraph[Future[Done]] =
Source.single("stackoverflow")
.map(s => s.toUpperCase())
.toMat(Sink.foreach(println))(Keep.right)
val runResult: Future[Done] = myStream.run()
当我运行这些示例时,在两种情况下都得到相同的输出:
STACKOVERFLOW //output
那么NotUsed和Done究竟是什么?有什么区别,什么时候我应该优先于另一个呢?
答案 0 :(得分:5)
首先,您所做的选择介于NotUsed
和Future[Done]
之间(不只是Done
)。
现在,您实际上是通过使用不同的组合器(to
和toMat
与Keep.right
)来确定图表的具体化值。
物化值是一种在流运行时与流进行交互的方式。此选择不会影响流处理的数据,因此在两种情况下都会看到相同的输出。相同的元素(字符串“stackoverflow”)遍历两个流。
选择取决于运行流后主程序应该执行的操作:
NotUsed
是正确的选择。它只是一个虚拟对象,它传达的信息是不允许也不需要与流进行交互Future[Done]
。这样您就可以使用(例如)onComplete
或map
附加回调。