【问题标题】: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 中的流?

【问题讨论】:

  • 可以使用嵌套的IntStreams。

标签: 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);
    

    【讨论】:

      猜你喜欢
      • 2021-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-05
      • 2023-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多