2016-11-18 116 views

回答

7

作为每the docs

的迭代器将重新用于每个物化,这是 该方法需要一个函数,而不是直接的迭代器 的原因被创建。

流阶段应该是可重用的,所以你可以实现它们不止一个。然而,给定的迭代器可以(经常)仅被使用一次。如果fromIterator创建了引用现有迭代器的源(无论是通过名称还是引用传递),则第二次尝试实现它可能会失败,因为基础迭代器将耗尽。

为了解决这个问题,源代码需要能够实例化一个新的迭代器,因此fromIterator允许您提供必要的逻辑来将其作为供应商函数执行此操作。

下面是我们不希望发生的事情为例:

implicit val system = akka.actor.ActorSystem.create("test") 
implicit val mat = akka.stream.ActorMaterializer(system) 

val iter = Iterator.range(0, 2) 
// pretend we pass the iterator directly... 
val src = Source.fromIterator(() => iter) 

Await.result(src.runForEach(println), 2.seconds) 
// 0 
// 1 
// res0: akka.Done = Done 

Await.result(src.runForEach(println), 2.seconds) 
// res1: akka.Done = Done 
// No results??? 

这是不好的,因为源src不重复使用,因为它并不会给后续运行相同的输出。但是,如果我们懒惰地创建迭代器,它会起作用:

val iterFunc =() => Iterator.range(0, 2) 
val src = Source.fromIterator(iterFunc) 

Await.result(src.runForEach(println), 2.seconds) 
// 0 
// 1 
// res0: akka.Done = Done 

Await.result(src.runForEach(println), 2.seconds) 
// 0 
// 1 
// res1: akka.Done = Done 
相关问题