2016-01-09 23 views
4

假設我有一個包含數千個獨立對象的數組。現在我想傳遞它們中的每一個並執行相同的操作,例如,更改特定字段的值。使用forEach()在多個線程或forEach()和lambdas中進行集合迭代

乍一看,有在爪哇8多種方法來這樣的任務,例如:

  1. forEach();與內部lambda表達式:

    itemsArr.forEach(項目 - > item.setValue(「test」));

  2. forEach();用迭代器。

  3. 將數組分成批號/塊,並在單獨的線程中處理每批。例如:定義2個線程,從#0到999的元素將在線程«A»中執行,其餘部分在線程«B»中執行。

最終結果應該是:100%的數組元素應該被關心。
這種任務的最佳方法是什麼?

更新: 有一個類似question而是另一個方面的會談,我沒有興趣在不同類型的循環性能比較(whileforforEach),但在威脅的性能比較VS 。lambdas在數組遍歷的任務中?

+0

如果性能不是什麼大不了的事,那麼你能解釋一下「優先」是什麼意思嗎? – user3707125

+0

讓一個數組包含一百萬個對象首先是一個壞主意。這取決於對象的類型,但我相信你可以找到它的替代品。然後,如果您需要修改每個單獨的值,則除了遍歷每個值之外,別無選擇。如何遍歷它們,然後取決於你的數據結構 – Gaktan

+0

@Gaktan,擁有*數百萬個對象*我真的誇大了事實上有成千上萬的對象。我更新了這個問題,以便更清楚地說明問題。 –

回答

6

使用平行流,JVM將使用多線程處理:

Arrays.stream(itemsArr).parallel().forEach(item -> item.setValue("test")); 

雖然你好像有一個集合,而不是一個數組,所以:

itemsArr.parallelStream().forEach(item -> item.setValue("test")); 
+0

謝謝,波希米亞人。這看起來像我在找什麼。還有一個問題,這種方法產生了多少線程?是否像'ForkJoinPool',根據這個http://stackoverflow.com/a/21172732/462347默認情況下,你有處理器少一個線程,由'Runtime.getRuntime()。availableProcessors()'返回。 –

+0

@MikeB。,不要忘記FJP使用調用者線程來完成工作,如果工作是從外部提供的,調用者等待工作完成。所以在實踐中它將等於可用處理器的數量。 –

+0

@TagirValeev,好的。順便說一下,在Java 8中,我讀了一些關於'parallelStream()'的負面反饋,關於它的副作用和陷阱。你在生產中使用它嗎? –