在Java 8版本之前,我们可以使用for循环初始化一个二维数组,如下所示。如何在JDK 1.8中使用lambda表达式执行以下操作?
int[][] board = new int[3][3];
int v = 1;
for (int i = 0; i < board.length; i++) {
for (int j = 0; j < 3; j++) {
board[i][j] = v;
v++;
System.out.println(v);
}
}
System.out.println(Arrays.deepToString(board));
基本上,我正在寻找一个如下数组
[[1,6],[2,7],[3,8],[4,9]]
发布于 2018-08-28 16:16:56
我强烈建议您坚持使用for-loop
来初始化具有原始值的数组。我的建议在多维数组的情况下更强。
然而,下面是方法:
int a = 4; // Number of outer array elements
int b = 2; // Number of inner array elements
int[][] board = IntStream
.range(0, a) // iterate 0..3
.mapToObj(i -> IntStream.range(0, b) // for each iteratoe 0..1
.map(j -> 1 + (i + (a + 1) * j)) // calculate the value
.toArray()) // compose the inner array
.toArray(int[][]::new); // compose the outer array
注意,IntStream
能够创建一个基元数组,因为它是一个基元整值元素的序列。它的方法IntStream::toArray
与int[]
相反。
外部数组的组成有点棘手,因为int[]
不再是一个原始值,而是一个数组本身。需要使用将int
映射到对象的IntStream::mapToObj
方法-然后返回Stream
,并且必须使用Stream::toArray(IntFunction generator)
转换为带参数的数组的方法,因为您不能将Object[]
转换为int[][]
。
传递的参数很简单。int[][]::new
和i -> new int[a][b]
没有什么不同。
发布于 2018-08-28 17:03:10
您可以组合使用IntStream
方法range
和iterate
int width = 4, height = 2;
IntStream.rangeClosed(1, width)
.mapToObj(column -> IntStream.iterate(column, v -> v + width)
.limit(height)
.toArray())
.toArray(int[][]::new);
通过使用iterate
作为内部循环,使用rangeClosed(1, width)
而不是range(0, width)
,我们可以简化计算。使用toArray
消除了自己创建和修改数组的需要,并将启用并行处理。
重要的是,实际正确地使用流,使它们不仅仅是奇怪地寻找循环。仅仅用range(0, x).forEach(...)
替换循环来修改局部变量并不是真正的“使用流”,更好的做法是坚持使用for循环。
https://stackoverflow.com/questions/52048349
复制相似问题