web-dev-qa-db-de.com

Stream aus einem zweidimensionalen Array in Java

Ich versuche, eine IntStream aus n-dimensionalen int-Arrays herauszuholen. Gibt es eine Nice-API-Methode, um dies zu tun? Ich kenne die verkettete Methode für zwei Streams. 

20
snihalani

Angenommen, Sie möchten ein Array eines Arrays sequentiell in Zeile-Major-Ansatz verarbeiten, sollte dies funktionieren:

int[][] arr = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
IntStream stream = Arrays.stream(arr).flatMapToInt(x -> Arrays.stream(x));

Zuerst ruft es die Arrays.stream(T[]) -Methode auf, wobei T als int[] abgeleitet wird, um einen Stream<int[]> zu erhalten, und ordnet dann die Stream#flatMapToInt() - Methode jedes int[]-Element mithilfe der Arrays.stream(int[]) -Methode einer IntStream zu.

40
Rohit Jain

Um die Antwort von Rohit weiter zu erweitern, kann eine Methodenreferenz verwendet werden, um den erforderlichen Code etwas zu verkürzen:

int[][] arr = { {1, 2, 3}, 
                {4, 5, 6},
                {7, 8, 9} };

IntStream stream = Arrays.stream(arr).flatMapToInt(Arrays::stream);
6
Jacob G.

Um nur die Elemente zu verarbeiten, verwenden Sie flatMap als Antwort von Rohit.

Um die Elemente mit ihren Indizes zu verarbeiten, können Sie IntStream.range wie folgt verwenden.

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 + " "));
    }
}
0
Alex K.