我正在尝试从n维IntStream
数组中获取int
。有一个很好的API方法吗?
我知道两个流的连接方法。
答案 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)