用流编写嵌套循环

时间:2014-11-16 17:27:40

标签: functional-programming java-8 java-stream

我曾经写过这样的函数的替代品:

 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中使用流?

2 个答案:

答案 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);