[英]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.