从java中的二维数组流

时间:2014-03-24 04:20:47

标签: java java-8 java-stream

我正在尝试从n维IntStream数组中获取int。有一个很好的API方法吗? 我知道两个流的连接方法。

4 个答案:

答案 0 :(得分:44)

假设您想在行主要方法中按顺序处理数组数组,这应该有效:

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

首先,它调用Arrays.stream(T[])方法,其中T被推断为int[],以获得Stream<int[]>,然后Stream#flatMapToInt()方法映射每个int[] 1}}元素使用Arrays.stream(int[])方法IntStream

答案 1 :(得分:6)

为了进一步扩展Rohit的答案,可以使用方法参考来略微缩短所需的代码量:

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

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

答案 2 :(得分:1)

除了前面的答案外,方法Arrays::stream返回顺序流 (请参阅:Oracle Javadoc)。在某些情况下,并行流可能会提高性能。要显式请求并行流,首先需要通过Arrays::asList转换为List,然后在生成的List上调用parallelStream()

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

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倍(这是我在自己的测试中测得的),或者根本没有提高。如果您的计算时间紧迫,那么值得尝试使用并行Stream。

答案 3 :(得分:0)

仅处理元素,请使用sudo a2ensite myvhost.conf ,如Rohit的回答。

要处理带有索引的元素,可以按如下方式使用IntStream.range

flatMap