我曾经写过这样的函数的替代品:
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中使用流?
答案 0 :(得分:6)
使用IntStream
s:
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));
答案 1 :(得分:2)
更实用的解决方案(不改变外部变量):
int[][] matrix =
IntStream.range(0, height)
.mapToObj(i -> IntStream.range(0, width)
.map(j -> i*width + j)
.toArray())
.toArray(int[][]::new);