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

我有以下课程:

public class MyClass{ //... public MyClass(int x, int y){ //... } } 

现在,我需要使用项目初始化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 

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

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

流不是很好地跟踪索引,这是你需要的。 所以你可以像@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))); 

你甚至可以让它看起来更实用,摆脱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); 

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

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

这是一种方法:

 int rows = 5; int cols = 10; MyClass[][] arr = new MyClass[rows][cols]; Stream.generate(new Supplier() { int currentValue = 0; @Override public MyClass get() { MyClass myClass = new MyClass(currentValue / cols, currentValue % cols); currentValue++; return arr[myClass.x][myClass.y] = myClass; } }).limit(rows * cols).forEach(System.out::println); 

输出:

 MyClass{x=0, y=0} MyClass{x=0, y=1} MyClass{x=0, y=2} ... MyClass{x=4, y=9} 

适应整数[] []的解决方案: 回答assylias :

 package com.gmail.jackkobec.java.core; import java.util.Arrays; import java.util.Random; import java.util.stream.IntStream; /** * @Author Jack  */ public class InitMatrixByStreamApi { public static final int ROWS_COUNT = 5; // Matrix rows number public static final int COLUMN_COUNT = 2; // Matrix columns number public static void main(String[] args) { Integer[][] matrixFromStreamApi = initMatrixInStream(ROWS_COUNT, COLUMN_COUNT); printMatrix(matrixFromStreamApi); } /** * Init matrix by random int values with border 777 * * @param rowsCount - Matrix rows number * @param columnsCount - Matrix columns number * @return Integer[][] */ public static Integer[][] initMatrixInStream(int rowsCount, int columnsCount) { return IntStream.range(0, rowsCount) .mapToObj(rowArray -> IntStream.range(0, columnsCount) .mapToObj(columnArrayElement -> new Random().nextInt(777)).toArray(Integer[]::new) ) .toArray(Integer[][]::new); } /** * Prints matrix. * * @param matrix */ public static void printMatrix(Integer[][] matrix) { Arrays.stream(matrix) .map(array -> Arrays.toString(array) + "\n") .forEach(System.out::println); } } 

[395,58]

[361,652]

[291,76]

[112,77]

[186,282]