2016-05-14 52 views
6

我搜索了這個,並試圖找到關於它的文檔,但沒有這樣做。是List.forEach在Java中訂購的嗎?

問題很簡單。 我有一個List讓我們說foo。如果我做

foo.forEach(this::doSomething) 並再次使用相同的線爲相同的foo我會每次迭代次序相同嗎?

如果是,那麼foo.stream().forEach()呢?

+0

如果順序數據結構的迭代順序不是連續的,那將會很奇怪。 –

+3

帶圖書館的一般規則:如果沒有明確記錄,那麼不要指望它的行爲如你所想,或一致。 – sim642

回答

9

forEachIterable定義的Javadoc說:

除非實現類另有規定, 動作在迭代的順序執行(如果指定的迭代順序 是)。

現在List.iterator()說:

返回在此列表中正確的序列中的元素的迭代器。

因此,默認情況下,您應該期望forEach按正確的順序枚舉元素 - 除非列表實現具有不同的迭代器實現。


根據Stream.forEach的Javadoc告訴你,你不應該依賴訂單上:

此操作的行爲是明確的不確定性。對於 並行流管線,此操作確實不是保證 尊重流的遇到順序,因爲這樣做會犧牲並行性的好處。

但也有Stream.forEachOrdered

執行用於該流的每個元件的操作,在該流的遭遇 順序如果流具有規定的遭遇順序。

+0

對不起,但在這種情況下'parallelStream()。forEach()'也會按順序返回嗎? –

+1

@SarpKaya不,它可能不 - 看我的編輯 – wero