2017-09-06 28 views
0

我正在嘗試創建一個可以通過類似Iterator的東西來消費的流。 我正在實現一個公開類似於迭代器的接口的庫,所以這對我來說是最簡單的東西。如何從akka流源獲取迭代器?

我目前設計的圖形本質上是Source<Iterator<DataRow>>。有一件事我看到到目前爲止是將其壓扁到Source<DataRow>然後用後跟https://docs.oracle.com/javase/8/docs/api/java/util/stream/BaseStream.html#iterator--

http://doc.akka.io/japi/akka/current/akka/stream/javadsl/StreamConverters.html#asJavaStream--但考慮到會有很多可能的許多行,我想知道是否會有意義,以避免整平步驟(以至少在akka流的上下文中,我假設當通過階段傳遞時有一些次要的元素開銷),或者如果有更直接的方式。

另外,我很好奇背壓如何在創建的流中工作,特別是兒童迭代器;它只緩衝一個元素嗎?

+0

您能否詳細說明*爲什麼*您需要*將它變成一個Iterator? –

+0

我正在實現一個暴露數據行(實質上是迭代器接口)的只向前遊標的api。要麼我需要消費一個迭代器,要麼基本上在其他東西上實現一個迭代器。 – Bwmat

回答

1

平步驟

平展Source<Iterator<DataRow>>Source<DataRow>不增加開銷的一些量,因爲你將不得不使用flatMapConcat它確實最終create a new GraphStage

但是,如果您有「許多」行,那麼這個單獨的階段可能會派上用場,因爲它會爲展平步驟提供併發性。

背壓

如果你看看at the codeStreamConverters.asJavaStream你會看到有一個QueueSink是產卵未來拉從阿卡流的下一個元素,然後做一個Await.result(nextElementFuture, Inf)等待在未來完成以便下一個元素可以被轉發到java Stream。

回答你的問題:是的,子迭代器只緩衝一個元素,但QueueSink有一個Future,它也可能有下一個DataRow。因此,javaStream &迭代器可能會有2個元素緩衝,但無論在原始akka Source中發生多少緩衝。