[英]How to get an iterator from an akka streams Source?
我正在尝试创建一个流程,我可以通过Iterator
类的东西使用它。 我正在实现一个公开类似迭代器接口的库,因此这对我来说是最简单的消费方式。
到目前为止,我设计的图表本质上是一个Source<Iterator<DataRow>>
。 到目前为止我看到的一件事是将它展平为Source<DataRow>
然后使用http://doc.akka.io/japi/akka/current/akka/stream/javadsl/StreamConverters.html#asJavaStream--其次是https ://docs.oracle.com/javase/8/docs/api/java/util/stream/BaseStream.html#iterator--
但是考虑到可能会有很多行,我想知道避免展平步骤是否有意义(至少在 akka 流上下文中,我假设通过阶段传递时每个元素的开销很小) ,或者如果有更直接的方法。
另外,我很好奇背压在创建的 stream 中是如何工作的,尤其是子迭代器; 它只缓冲一个元素吗?
展平步骤
将Source<Iterator<DataRow>>
为Source<DataRow>
确实会增加一些开销,因为您必须使用flatMapConcat
,最终会创建一个新的GraphStage
。
但是,如果您有“许多”行,则此单独的阶段可能会派上用场,因为它将为扁平化步骤提供并发性。
背压
如果查看StreamConverters.asJavaStream
的代码 ,您会看到有一个QueueSink
生成了Future来从akka流中提取下一个元素,然后执行Await.result(nextElementFuture, Inf)
以等待Future完成,以便可以将下一个元素转发到java流。
回答您的问题:是的,子Iterator仅缓冲一个元素,但是QueueSink具有Future,也可能具有下一个DataRow
。 因此,javaStream&Iterator可能缓冲了2个元素,但是在原始akka Source
进行了很多缓冲。
或者,您可以在幕后使用prefixAndTail(1)
来实现 Iterator 以实现hasNext
和next
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.