2015-06-07 81 views
8

我正在實施Spliterator明確限制並行化的trySplit()返回null。執行estimateSize()是否會爲此分割器生成的流提供任何性能改進?或者估計的大小隻對並行化有用?估計連續Spliterator上的大小()

編輯:爲了澄清,我具體詢問估計大小。換句話說,我的分割器沒有SIZED特性。

+0

至少toArray方法將使用估計的大小;合理準確的估計可能會減少複製。 –

回答

5

查看調用層次結構相關spliterator特徵表明,它至少相關stream.toArray()性能

enter image description here

此外,還有內部流實現等效的標誌,似乎是用來排序:

enter image description here

所以除了並行流操作外,大小估計似乎被用於這兩種操作。

我沒有爲我的搜索要求詳盡,所以只要拿這些作爲例子。


不施膠特點我只能找到estimateSize()是相關的流管道並行執行調用。

當然,這可能會在將來或另一個Stream實現中發生變化,而不是標準JDK的行爲可能會有所不同。

+0

澄清了我的問題。 – shmosel

+1

在這種情況下,它似乎只用於並行執行 – the8472

+0

那麼,最重要的句子是最後一句:「*當然這可能會改變在未來或另一個Stream實現比標準的JDK可以有不同的行爲*」,值得+1。還應該注意的是,其他庫也可能直接訪問「Spliterator」並獲得這樣的功能。這就是爲什麼總是建議針對*合同*進行編程的原因,而不是當前的實施。 – Holger

0

甲spliterator可以遍歷元素:

1.Individually(tryAdvance()

2.Sequentially散裝(forEachRemaining()

作爲每java docsestimateSize()分裂期間來得心應手。

通過estimateSize()方法,Spliterators可以提供估計剩餘的 元素的數量。理想情況下,如 特性SIZED所示,該值完全對應於將在成功遍歷中遇到的 元素的數量。 然而,即使當未完全知道時,估計值值仍然可以是對在源上執行的操作有用的,例如幫助確定是進一步分割還是沿着順序遍歷 其餘元素。

因爲你spliterator沒有施膠特徵estimateSize將不提供任何性能(因爲沒有並行的),但是請記住,estimateSize Java的文檔沒有提到並行的東西,所有它指出是:

返回:估計大小,或Long.MAX_VALUE(如果無限,未知, 或計算太昂貴)。

+1

粗體部分給出的唯一例子是確定是否可以進一步分割。分裂只用於並行流,OP會明確拒絕,因此是問題。 –