用Java初始化带有流的2d数组

3 java arrays java-stream

我有以下课程:

public class MyClass{
    //...
    public MyClass(int x, int y){
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我需要使用项目初始化2d-array

int rows;
int cols;
//initializing rows and cols
MyClass[][] arr = new MyClass[rows][cols];
//how to initialize arr[x][y] with 
//new MyClass(x, y) with streams API
Run Code Online (Sandbox Code Playgroud)

我看了一下这个例子,但它在我的情况下不起作用.他们使用单一IntStream

问题:当然我可以使用嵌套for循环,但我认为它现在是旧式的并且考虑不好.那么如何应用流api并以其Java8方式启动它?

ass*_*ias 5

流不是很好地跟踪索引,这是你需要的.所以你可以像@NicolasFilotto建议那样滥用它们,或者以更简单的方式:

MyClass[][] array = new MyClass[rows][cols];
IntStream.range(0, rows)
         .forEach(r -> IntStream.range(0, cols)
                                .forEach(c -> array[r][c] = new MyClass(r, c)));
Run Code Online (Sandbox Code Playgroud)

你甚至可以让它看起来更实用,摆脱forEach突变部分:

MyClass[][] array = IntStream.range(0, rows)
                .mapToObj(r -> IntStream.range(0, cols)
                                        .mapToObj(c -> new MyClass(r, c))
                                        .toArray(MyClass[]::new))
                .toArray(MyClass[][]::new);
Run Code Online (Sandbox Code Playgroud)

但老实说,for循环不是过时的:

for (int r = 0; r < rows; r++) {
  for (int c = 0; c < cols; c++) {
    array[r][c] = new MyClass(r, c);
  }
}
Run Code Online (Sandbox Code Playgroud)