2016-03-09 61 views
1

是否可以遍歷int數組而不是IntStream,但使用索引?使用索引對迭代IntStream進行迭代

試圖做這樣的事情:

ByteBuf buf = ...; 
int[] anArray = ...; 

IntStream.of(anArray).forEach(...); // get index so I can do "anArray[index] = buf.x" 
+2

如果你想改變'anArray'你爲什麼要使用流? – Amit

+1

您不應該改變已創建流的數組(或集合),否則很可能會導致意外且難以調試的結果。 – Gavin

回答

3

你不應該使用一個IntStream變異的陣列。相反,請使用Arrays.fill()方法:

Arrays.fill(anArray, buf.x); 
4

通常,使用Stream API修改源代碼是個不錯的主意。 Stream API最適合處理不可變數據(創建新對象而不是改變現有對象)。如果你想用索引填充一個數組來計算這個值,你可以使用Arrays.setAll。例如:

int[] arr = new int[10]; 
Arrays.setAll(arr, i -> i*2); 
// array is filled with [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] now 

如果你仍然想使用流API,可以產生價值流,並將它們轉儲到陣列之後(而無需手動創建陣列):

int[] arr = IntStream.range(0, 10).map(i -> i*2).toArray(); 

同樣可以生成數組值不依賴於索引。例如,從隨機數發生器:

Random r = new Random(); 
int[] arr = IntStream.generate(() -> r.nextInt(1000)).limit(10).toArray(); 

雖然最好使用專用的方法Random類:

int[] arr = new Random().ints(10, 0, 1000).toArray(); 

如果你只是想創建一個數組具有相同值填充它,你也可以使用generate

int[] arr = IntStream.generate(() -> buf.x).limit(10).toArray(); 

雖然使用Arrays.fill,作爲@FedericoPeraltaSchaffner表明,看起來比較清爽。