首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在java 8中初始化二维数组

如何在java 8中初始化二维数组
EN

Stack Overflow用户
提问于 2018-08-28 07:55:04
回答 2查看 7K关注 0票数 2

在Java 8版本之前,我们可以使用for循环初始化一个二维数组,如下所示。如何在JDK 1.8中使用lambda表达式执行以下操作?

代码语言:javascript
复制
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));

基本上,我正在寻找一个如下数组

代码语言:javascript
复制
[[1,6],[2,7],[3,8],[4,9]]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-28 16:16:56

我强烈建议您坚持使用for-loop来初始化具有原始值的数组。我的建议在多维数组的情况下更强。

然而,下面是方法:

代码语言:javascript
复制
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::toArrayint[]相反。

外部数组的组成有点棘手,因为int[]不再是一个原始值,而是一个数组本身。需要使用将int映射到对象的IntStream::mapToObj方法-然后返回Stream,并且必须使用Stream::toArray(IntFunction generator)转换为带参数的数组的方法,因为您不能将Object[]转换为int[][]

传递的参数很简单。int[][]::newi -> new int[a][b]没有什么不同。

票数 4
EN

Stack Overflow用户

发布于 2018-08-28 17:03:10

您可以组合使用IntStream方法rangeiterate

代码语言:javascript
复制
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循环。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52048349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档