web-dev-qa-db-fra.com

Flux depuis un tableau à deux dimensions en java

J'essaie d'obtenir une variable IntStream à partir d'un tableau int à n dimensions. Existe-t-il une méthode Nice API pour le faire? 

20
snihalani

En supposant que vous souhaitiez traiter un tableau de tableau séquentiellement dans une approche en lignes majeures, ceci devrait fonctionner:

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

Tout d'abord, elle appelle la méthode Arrays.stream(T[]) , où T est déduit en tant que int[], pour obtenir un Stream<int[]>, puis Stream#flatMapToInt() mappe chaque élément int[] en IntStream à l'aide de Arrays.stream(int[]) méthode.

40
Rohit Jain

Pour approfondir la réponse de Rohit, une référence à une méthode peut être utilisée pour réduire légèrement la quantité de code requise:

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

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

Pour ne traiter que les éléments, utilisez flatMap comme dans la réponse de Rohit.

Pour traiter les éléments avec leurs index, vous pouvez utiliser IntStream.range comme suit.

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.