【问题标题】:How to fill 2 dimensional array using Lambda in Java如何在 Java 中使用 Lambda 填充二维数组
【发布时间】:2020-11-05 01:07:08
【问题描述】:

我正在尝试创建double 的简单二维数组。 使用for 循环,让它变得像这样没什么大不了的:

static public double[][] genMatrix(int n) {
    double mat[][]=new double[n][n];
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            mat[i][j]=generateDouble();
    return mat;
}

我想用 lambda 表达式和forEach 使它更平滑,但我得到一个充满零的数组。为什么?

private static double[][] genSquareMatrix(int matrixDimension) {
    double matrix[][] = new double[matrixDimension][matrixDimension];
    Arrays.stream(matrix).forEach(x->Arrays.stream(x).forEach(y-> y = generateDouble()));
    return matrix;
}

顺便说一句,当我使用 lambda 打印该数组时没有问题。

【问题讨论】:

  • 这看起来很有希望:Lambda expression to initialize array
  • 您只得到零,因为您没有向数组写入任何内容。您只需迭代所有默认初始化为零的元素,并始终用generateDouble 覆盖局部变量y
  • @akuzminykh 我希望它比我在大学时的讲师版本更短,但现在看来他知道自己在做什么
  • 是的,只要保持简单并在一开始就使用循环。您接受的答案是顺便说一句。错误的。它解决了正确的问题,但没有回答您的问题。
  • @akuzminykh 你能进一步解释一下吗? Java Streams 不会以任何方式修改其源代码。取自here:本质上是功能性的。对流的操作会产生结果,但不会修改其源。例如,过滤从集合中获得的 Stream 会生成一个没有过滤元素的新 Stream,而不是从源集合中删除元素。

标签: java lambda foreach


【解决方案1】:

关于documentation

本质上是功能性的。对流的操作会产生结果,但不会修改其源。例如,过滤从集合中获得的 Stream 会生成一个没有过滤元素的新 Stream,而不是从源集合中删除元素。

它返回一个DoubleStream,它支持

顺序和并行聚合操作

这就是它不起作用的原因。

编辑:第一部分不正确。替换为更正确的版本

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 2012-03-08
    相关资源
    最近更新 更多