java中二维数组的流

java中二维数组的流,java,multidimensional-array,java-8,java-stream,Java,Multidimensional Array,Java 8,Java Stream,我试图从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)); 首先,它调用方法,其中T被推断为int[],以获得流,然后方法使用方法

我试图从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));

首先,它调用方法,其中
T
被推断为
int[]
,以获得
,然后方法使用方法将每个
int[]
元素映射到
IntStream

要进一步扩展Rohit的答案,可以使用方法引用稍微缩短所需的代码量:

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

IntStream stream = Arrays.stream(arr).flatMapToInt(Arrays::stream);

要仅处理元素,请使用Rohit答案中的
flatMap

要处理元素及其索引,可以使用以下方法

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
返回一个顺序流 (见:)。在某些情况下,并行流可能会提高性能。要显式请求并行流,首先需要通过
Arrays::asList
转换为列表,然后在结果列表上调用
parallelStream()

要使用
IntStream
计算二维
int
数组的和,可以使用以下代码:

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


根据阵列的大小和结构,您可能会看到性能提高了4倍(这是我在自己的测试中测量的),或者根本没有。如果您的计算是时间关键型的,那么可能值得尝试使用并行流。

您是否可以添加更多关于您拥有的数据的详细信息,以及您希望如何传递这些数据?我只有一个二维int数组。我认为解决方案不依赖于数据吗?是否希望
IntStream
int[][]
中迭代每个
int
?Java 8中的Arrays类有一个公共静态流(t[]array)方法。我想那就行了。但我认为IntStream只适用于n=1。@SotiriosDelimanolis,因此它确实给出了一个
IntStream
遍历数组,如
1,2,3,4,5,6,…
?是的。赋予
flatMapToInt
函数
获取
int[][]
中的每个元素,即单个
int[]
,并为每个元素构造并返回一个新的
IntStream
。所有这些都连接到一个最终的
IntStream
,并返回。(不完全是这样,但你可以这么想。)这整个功能对我来说都是新鲜事:|