如何求和两个二维数组的元素?

Kkh*_*Kkh 1 java arrays lambda declarative-programming java-stream

我正在尝试使用 java 流 API 将两个二维数组的元素相互添加。
我用一维数组解决了这个问题,但我不知道如何进一步处理二维数组。

这是要转换的代码:

public static int[][] add(final int[][] m1, final int[][] m2) {
    int[][] e = new int[m2.length][m2[0].length];
    for (int i = 0; i < m1.length; i++) {
        for (int j = 0; j < m1[i].length; j++) {
            e[i][j] = m1[i][j] + m2[i][j];
        }
    }
    return e;
}
Run Code Online (Sandbox Code Playgroud)

这是我为相同目的编写的代码,但仅使用一维数组

public static int[] addOneDimension(final int[] a, final int b[]) {
    int[] c = IntStream.range(0, a.length)
            .map(i -> a[i] + b[i])
            .toArray();
    return c;
}
Run Code Online (Sandbox Code Playgroud)

特别是不知道如何map()在二维数组上使用该 方法。

Ale*_*nko 7

这可以使用IntStream及其方法mapToObj来处理行和map处理每行中的元素来实现:

static int[][] add(int[][] a, int [][] b) {
    return IntStream.range(0, a.length)
                    .mapToObj(i -> add(a[i], b[i])) // int[] is object
                    .toArray(int[][]::new);         // create new 2D array
}
    
static int[] add(int[] a, int[] b) {
    return IntStream.range(0, a.length)
                    .map(i -> a[i] + b[i])  // processing int operands
                    .toArray();             // IntStream.toArray() returns int[]
}
Run Code Online (Sandbox Code Playgroud)

测试

int[][] a = {
    {1, 2},
    {3, 4}
};

int[][] b = {
    {10, 20},
    {30, 40}
};

System.out.println("Sum of a + b = ");
Arrays.stream(add(a, b))
      .map(Arrays::toString)
      .forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

输出

Sum of a + b = 
[11, 22]
[33, 44]
Run Code Online (Sandbox Code Playgroud)

单方法实现可能如下:

int[][] a = {
    {1, 2},
    {3, 4}
};

int[][] b = {
    {10, 20},
    {30, 40}
};

System.out.println("Sum of a + b = ");
Arrays.stream(add(a, b))
      .map(Arrays::toString)
      .forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)