我正在尝试IntStream
从 n 维int
数组中取出一个。有没有很好的 API 方法来做到这一点?我知道两个流的连接方法。
4 回答
假设您想以行优先方法顺序处理数组数组,这应该有效:
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[]
,以获取 a Stream<int[]>
,然后Stream#flatMapToInt()
方法将每个元素映射int[]
到IntStream
usingArrays.stream(int[])
方法。
为了进一步扩展 Rohit 的答案,可以使用方法参考来稍微缩短所需的代码量:
int[][] arr = { {1, 2, 3},
{4, 5, 6},
{7, 8, 9} };
IntStream stream = Arrays.stream(arr).flatMapToInt(Arrays::stream);
要仅处理元素,请使用flatMap
Rohit 的答案。
要处理带有索引的元素,您可以使用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)。在某些情况下,并行流可能会提高性能。要显式请求并行流,首先需要通过 转换为 List Arrays::asList
,然后调用parallelStream()
生成的 List。
要使用 a 计算二维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 倍(这是我在自己的测试中测量的),或者根本没有。如果您的计算时间紧迫,则可能值得尝试使用并行流。