[英]Stream from two dimensional array in java
我正在嘗試從 n 維int
數組中獲取IntStream
。 有沒有很好的 API 方法來做到這一點? 我知道兩個流的連接方法。
假設您想以行優先方法順序處理數組數組,這應該有效:
int[][] arr = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
IntStream stream = Arrays.stream(arr).flatMapToInt(x -> Arrays.stream(x));
首先它調用Arrays.stream(T[])
方法,其中T
被推斷為int[]
,以獲得一個Stream<int[]>
,然后Stream#flatMapToInt()
方法將每個int[]
元素映射到一個IntStream
使用Arrays.stream(int[])
方法。
為了進一步擴展 Rohit 的答案,可以使用方法參考來稍微縮短所需的代碼量:
int[][] arr = { {1, 2, 3},
{4, 5, 6},
{7, 8, 9} };
IntStream stream = Arrays.stream(arr).flatMapToInt(Arrays::stream);
要僅處理元素,請按照 Rohit 的回答使用flatMap
。
要處理帶有索引的元素,您可以使用IntStream.range
如下。
import java.util.stream.IntStream;
import static java.util.stream.IntStream.range;
public class StackOverflowTest {
public static void main(String... args) {
int[][] arr = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
// Map the two dimensional array with indices.
final IntStream intStream = range(0, arr.length).flatMap(row -> range(0, arr[row].length).map(col -> {
final int element = arr[row][col];
// E.g. multiply elements in odd numbered rows and columns by two.
return row % 2 == 1 || col % 2 == 1 ? element * 2 : element;
}));
// Prints "1 4 3 8 10 12 7 16 9 ".
intStream.forEachOrdered(n -> System.out.print(n + " "));
}
}
添加到前面的答案中,方法Arrays::stream
返回一個順序流(請參閱: Oracle Javadoc )。 在某些情況下,並行流可能會提高性能。 要顯式請求並行流,首先需要通過Arrays::asList
轉換為 List,然后對結果 List 調用parallelStream()
。
要使用IntStream
計算二維int
數組的IntStream
,可以使用以下代碼:
int[][] twoDimArray = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
IntStream intStream = Arrays.asList(twoDimArray)
.parallelStream() // "rows" in parallel
.flatMapToInt(Arrays::stream); // "columns" sequentially
int sum = intStream.sum(); // = 45
為處理外層(行,第一維)而創建的流現在並行執行,而內層(列,第二維)的Arrays::stream
仍然是順序的(使用上面提到的Arrays::stream
)。
根據數組的大小和結構,您可能會看到性能提高了 4 倍(這是我在自己的測試中測得的),或者根本沒有。 如果您的計算對時間要求嚴格,那么使用並行流可能值得一試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.