【问题标题】:Writing nested loops with streams用流编写嵌套循环
【发布时间】:2014-11-16 17:27:39
【问题描述】:
我曾经为这样的函数写了一个替换:
int[][] createMatrix(int height, int width) {
int[][] matrix = new int[height][width];
for (int i = 0; i < height; ++i) {
for (int j = 0; j < width; ++j) {
matrix[i][j] = i * width + j;
}
}
return matrix;
}
但现在,我发现自己无法再这样做了。如何重构该代码以使用 Java 8 中的流?
【问题讨论】:
标签:
functional-programming
java-8
java-stream
【解决方案1】:
与IntStreams:
IntStream.range(0, height)
.forEach(i -> IntStream.range(0, width)
.forEach(j -> matrix[i][j] = i * width + j));
你也可以使用Arrays#setAll:
Arrays.setAll(matrix, i -> {
Arrays.setAll(matrix[i], j -> i * width + j);
return matrix[i];
});
或将它们组合起来:
IntStream.range(0, height)
.forEach(i -> Arrays.setAll(matrix[i], j -> i * width + j));
【解决方案2】:
更实用的解决方案(不改变外部变量):
int[][] matrix =
IntStream.range(0, height)
.mapToObj(i -> IntStream.range(0, width)
.map(j -> i*width + j)
.toArray())
.toArray(int[][]::new);