我有以下课程:
public class MyClass{
//...
public MyClass(int x, int y){
//...
}
}
现在,我需要使用项目
初始化2d-arrayint 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
我看了这个example,但在我的情况下不起作用。他们使用一个IntStream
问题: 当然我可以使用嵌套for循环,但我认为它现在是旧式的并且考虑不好。那么如何应用流api并以Java8
的方式启动它?
答案 0 :(得分:5)
Streams并不擅长跟踪你需要的索引。所以你可以像@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);
}
}
答案 1 :(得分:1)
这是一种方法:
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);
<强>输出:强>
MyClass{x=0, y=0}
MyClass{x=0, y=1}
MyClass{x=0, y=2}
...
MyClass{x=4, y=9}
答案 2 :(得分:1)
您可以使用两个嵌套的 IntStream
生成二维数组,如下所示:
public static void main(String[] args) {
int rows = 2, cols = 3;
// generate an array
MyClass[][] arr = IntStream.range(0, rows)
.mapToObj(x -> IntStream.range(0, cols)
.mapToObj(y -> new MyClass(x, y))
.toArray(MyClass[]::new))
.toArray(MyClass[][]::new);
// output
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}]
}
public static class MyClass {
int x, y;
public MyClass(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public String toString() {
return "{x=" + x + ", y=" + y + "}";
}
}
答案 3 :(得分:0)
适应整数[] []求解:answered assylias:
package com.gmail.jackkobec.java.core;
import java.util.Arrays;
import java.util.Random;
import java.util.stream.IntStream;
/**
* @Author Jack <jackkobec>
*/
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]