我搜索了這個,並試圖找到關於它的文檔,但沒有這樣做。是List.forEach在Java中訂購的嗎?
問題很簡單。 我有一個List
讓我們說foo。如果我做
foo.forEach(this::doSomething)
並再次使用相同的線爲相同的foo
我會每次迭代次序相同嗎?
如果是,那麼foo.stream().forEach()
呢?
我搜索了這個,並試圖找到關於它的文檔,但沒有這樣做。是List.forEach在Java中訂購的嗎?
問題很簡單。 我有一個List
讓我們說foo。如果我做
foo.forEach(this::doSomething)
並再次使用相同的線爲相同的foo
我會每次迭代次序相同嗎?
如果是,那麼foo.stream().forEach()
呢?
forEach
在Iterable
定義的Javadoc說:
除非實現類另有規定, 動作在迭代的順序執行(如果指定的迭代順序 是)。
現在List.iterator()
說:
返回在此列表中正確的序列中的元素的迭代器。
因此,默認情況下,您應該期望forEach
按正確的順序枚舉元素 - 除非列表實現具有不同的迭代器實現。
根據Stream.forEach
的Javadoc告訴你,你不應該依賴訂單上:
此操作的行爲是明確的不確定性。對於 並行流管線,此操作確實不是保證 尊重流的遇到順序,因爲這樣做會犧牲並行性的好處。
但也有Stream.forEachOrdered
:
執行用於該流的每個元件的操作,在該流的遭遇 順序如果流具有規定的遭遇順序。
對不起,但在這種情況下'parallelStream()。forEach()'也會按順序返回嗎? –
@SarpKaya不,它可能不 - 看我的編輯 – wero
如果順序數據結構的迭代順序不是連續的,那將會很奇怪。 –
帶圖書館的一般規則:如果沒有明確記錄,那麼不要指望它的行爲如你所想,或一致。 – sim642