用Java中的流初始化二维数组

用Java中的流初始化二维数组,java,arrays,multidimensional-array,java-8,java-stream,Java,Arrays,Multidimensional Array,Java 8,Java Stream,我有以下课程: 公共类MyClass{ //... 公共MyClass(整数x,整数y){ //... } } 现在,我需要使用以下项目初始化2D数组: int行; int cols; //初始化行和列 MyClass[][]arr=新的MyClass[行][cols]; //如何使用初始化arr[x][y] //带有streams API的新MyClass(x,y) 我看了这个例子,但它在我的例子中不起作用:。它们使用单个IntStream 问题:当然我可以使用嵌套for循环,但我认为它现

我有以下课程:

公共类MyClass{
//...
公共MyClass(整数x,整数y){
//...
}
}
现在,我需要使用以下项目初始化2D数组:

int行;
int cols;
//初始化行和列
MyClass[][]arr=新的MyClass[行][cols];
//如何使用初始化arr[x][y]
//带有streams API的新MyClass(x,y)
我看了这个例子,但它在我的例子中不起作用:。它们使用单个
IntStream


问题:当然我可以使用嵌套for循环,但我认为它现在已经过时了,而且被认为是不好的。那么,如何应用streams api并以Java 8方式初始化它呢?

以下是一种方法:

int rows = 5;
int cols = 10;
MyClass[][] arr = new MyClass[rows][cols];
Stream.generate(new Supplier<MyClass>() {
    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);

流不太擅长跟踪索引,这是您在这里需要的。所以你可以像@NicolasFilotto建议的那样滥用它们,或者用一种更简单的方式:

MyClass[][]数组=新的MyClass[行][cols];
IntStream.range(0,行)
.forEach(r->IntStream.range(0,cols)
.forEach(c->array[r][c]=newmyclass(r,c));
您甚至可以让它看起来更具功能性,并去掉
forEach
和变异部分:

MyClass[][]数组=IntStream.range(0,行)
.mapToObj(r->IntStream.range(0,cols)
.mapToObj(c->新MyClass(r,c))
.toArray(MyClass[]::新建))
.toArray(MyClass[]]::新建);
但老实说,for循环并不是过时的:

MyClass{x=0, y=0}
MyClass{x=0, y=1}
MyClass{x=0, y=2}
...
MyClass{x=4, y=9}
for(int r=0;r
针对解决方案的
整数[][
自适应:

package com.gmail.jackkobec.java.core;
导入java.util.array;
导入java.util.Random;
导入java.util.stream.IntStream;
/**
*@作者杰克
*/
公共类InitMatrixByStreamApi{
公共静态final int ROWS\u COUNT=5;//矩阵行数
公共静态final int COLUMN_COUNT=2;//矩阵列数
公共静态void main(字符串[]args){
整数[][]matrixFromStreamApi=initMatrixInStream(行数、列数);
printMatrix(matrixFromStreamApi);
}
/**
*用带边框的随机整数值初始化矩阵777
*
*@param rowsCount-矩阵行数
*@param columnsCount-矩阵列数
*@返回整数[][]
*/
公共静态整数[][]initMatrixInStream(int-rowsCount,int-columnsCount){
返回IntStream.range(0,rowsCount)
.mapToObj(行数组->IntStream.range(0,columnsCount)
.mapToObj(columnArrayElement->new Random().nextInt(777))
.toArray(整数[]::新))
.toArray(整数[]]::新建);
}
/**
*打印矩阵。
*
*@param矩阵
*/
公共静态void打印矩阵(整数[][]矩阵){
数组.流(矩阵)
.map(数组->数组.toString(数组)+“\n”)
.forEach(System.out::println);
}
}
输出:

[395, 58]
[361, 652]
[291, 76]
[112, 77]
[186, 282]

可以使用两个嵌套的生成二维数组,如下所示:

publicstaticvoidmain(字符串[]args){
int行=2,cols=3;
//生成数组
MyClass[][]arr=IntStream.range(0,行)
.mapToObj(x->IntStream.range(0,cols)
.mapToObj(y->新MyClass(x,y))
.toArray(MyClass[]::新建))
.toArray(MyClass[]]::新建);
//输出
Arrays.stream(arr.map)(Arrays::toString.forEach(System.out::println);
//[{x=0,y=0},{x=0,y=1},{x=0,y=2}]
//[{x=1,y=0},{x=1,y=1},{x=1,y=2}]
}
公共静态类MyClass{
int x,y;
公共MyClass(整数x,整数y){
这个.x=x;
这个。y=y;
}
@凌驾
公共字符串toString(){
返回“{x=“+x+”,y=“+y+”}”;
}
}