簡體   English   中英

來自java中的二維數組的流

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM