繁体   English   中英

来自java中的二维数组的流

[英]Stream from two dimensional array in java

我正在尝试从 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));

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

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

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

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

要仅处理元素,请按照 Rohit 的回答使用flatMap

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

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

要使用IntStream计算二维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仍然是顺序的(使用上面提到的Arrays::stream )。

根据数组的大小和结构,您可能会看到性能提高了 4 倍(这是我在自己的测试中测得的),或者根本没有。 如果您的计算对时间要求严格,那么使用并行流可能值得一试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM