如何在 Java 中與流和二維數組相互轉換
1. 概述
使用陣列和流是 Java 中的常見任務,尤其是在處理複雜的資料結構時。雖然一維數組和流很簡單,但二維數組和流之間的轉換可能會更複雜。
在本教程中,我們將透過詳細的解釋和實際範例逐步介紹如何將 2D 陣列轉換為串流,反之亦然。
2. 將二維數組轉換為流
我們將討論解決這個問題的兩種方法。第一個是將其轉換為行流,第二個是將其轉換為平面流。
2.1.將二維數組轉換為行流
要將二維數組轉換為其行流,我們可以使用Arrays.stream()
方法。
讓我們看看各自的測試案例:
int[][] array2D = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
Stream<int[]> streamOfRows = Arrays.stream(array2D);
int[][] resultArray2D = streamOfRows.toArray(int[][]::new);
assertArrayEquals(array2D, resultArray2D);
這將建立一個Stream<int[]>
,其中流中的每個元素都是一個表示原始 2D 陣列的一行的陣列。
2.2.轉換為扁平流
如果我們想要將 2D 陣列展平為單一元素流,可以使用flatMapToInt()
方法。
讓我們來看一個測試案例,展示如何實現它:
int[][] array2D = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
IntStream flatStream = Arrays.stream(array2D)
.flatMapToInt(Arrays::stream);
int[] resultFlatArray = flatStream.toArray();
int[] expectedFlatArray = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
assertArrayEquals(expectedFlatArray, resultFlatArray);
此方法採用一個函數,將每行(數組)映射到IntStream
,然後將這些流展平為單一IntStream
。
3. 將流轉換為二維數組
讓我們來看看將流轉換為二維數組的兩種方法。
3.1.將行流轉換為二維數組
要將行(數組)流轉換回二維數組,我們可以使用Stream.toArray()
方法。我們必須提供一個陣列生成器函數來建立所需類型的二維數組。
讓我們看看如何做到這一點:
int[][] originalArray2D = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
Stream<int[]> streamOfRows = Arrays.stream(originalArray2D);
int[][] resultArray2D = streamOfRows.toArray(int[][]::new);
assertArrayEquals(originalArray2D, resultArray2D);
這樣我們就可以輕鬆地將流轉換為二維數組。
3.2.將扁平流轉換為二維數組
如果我們有一個扁平的元素流並希望將其轉換為二維數組,我們需要知道目標數組的維度。我們可以先將流收集到平面數組中,然後相應地填充二維數組。
讓我們看看如何:
int[] flatArray = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
IntStream flatStream = Arrays.stream(flatArray);
int rows = 3;
int cols = 3;
int[][] expectedArray2D = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
int[][] resultArray2D = new int[rows][cols];
int[] collectedArray = flatStream.toArray();
for (int i = 0; i < rows; i++) {
System.arraycopy(collectedArray, i * cols, resultArray2D[i], 0, cols);
}
assertArrayEquals(expectedArray2D, resultArray2D);
結果,我們將得到最終的二維數組。
4. 結論
在本文中,我們看到在 Java 中進行 2D 數組和流之間的轉換是一項寶貴的技能,可以簡化許多程式設計任務,特別是在處理大型資料集或執行複雜轉換時。
透過了解如何有效地將 2D 數組轉換為行流或平面流,然後將它們重新組裝回 2D 數組,我們可以充分利用 Java Stream API 的全部功能來實現更有效率和可讀的程式碼。提供的範例和單元測試作為實用指南來幫助我們掌握這些轉換,確保我們的程式碼保持乾淨和可維護。
與往常一樣,所有這些範例的原始程式碼都可以在 GitHub 上取得。