IntStream用于求和2D数组

jdp*_*itt 3 java arrays java-8

使用IntStream对2D数组中的一系列元素求和的语法是什么?

对于1D数组,我使用以下语法:

int totalElementsInArray = 0;

totalElementsInarray = IntStream.of(myArray).sum();
Run Code Online (Sandbox Code Playgroud)

例如,假设我有一个2D数组:

int[][] my2DArray = new int[17][4];
Run Code Online (Sandbox Code Playgroud)

使用IntStream对第0行的第0-16列求和时的语法是什么?

int totalElementsInArray = 0;

totalElementsInarray = IntStream.of(my2DArray[0 through 16][0]).sum();
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 6

您只需要int通过获取第一个元素将每个子数组映射到a :

import java.util.*;
import java.util.stream.*; 

class Test {
    public static void main(String args[]) {
        int[][] data = {
            { 1, 2, 3 },
            { 4, 5, 6 }
        };

        int sum = Arrays.stream(data)
                        .mapToInt(arr -> arr[0])
                        .sum();
        System.out.println(sum); // 5, i.e. data[0][0] + data[1][0]
    } 
}
Run Code Online (Sandbox Code Playgroud)

换一种说法:

  • 转换data为a Stream<int[]>(即简单int数组流)
  • 将每个数组映射到它的第一个元素,所以我们最终得到一个 IntStream
  • 汇总流

我更喜欢这种方法而不是使用方法range,因为似乎不需要考虑子数组的索引.例如,如果你只有一个Iterable<int[]> arrays你仍然可以使用StreamSupport.stream(arrays.spliterator(), false).mapToInt(arr -> arr[0]).sum(),而范围方法需要多次迭代.

  • 再加上一个速度,你设法将一个精彩的答案转换为一个不同的问题,以一个明亮的答案!`Iterable`虽然没有`stream`方法... (2认同)

Pau*_*ton 2

你可以这样做

IntStream.range(0, 17)
         .map(i -> my2DArray[i][0])
         .sum();
Run Code Online (Sandbox Code Playgroud)