簡體   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