繁体   English   中英

如何从 akka 流源获取迭代器?

[英]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 以实现hasNextnext

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM