【问题标题】:Java 8 Lambda to convert Number[][] to double[][]Java 8 Lambda 将 Number[][] 转换为 double[][]
【发布时间】:2015-03-20 22:47:19
【问题描述】:
Number[][] intArray = new Integer[][]{ {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
double[][] doubleArray = Arrays.stream(intArray)
                            .forEach(pArray -> Arrays.stream(pArray)
                                                .mapToDouble(d ->d.doubleValue())
                                                .toArray())
                            .toArray();

我想将 Number[][] 转换为 double[][]。上面的 lambda 不起作用,外部的 toArray 没有编译。

Arrays.stream(intArray) : 返回一个 Integer[] 流
forEach :对于每个 Integer[],创建一个 Integer 流,将每个 Integer 转换为 double 并返回一个 double[]。
for each 创建了 double[],我认为外部 toArray 会返回这个 double[] 的数组
我怎样才能让它工作?

【问题讨论】:

    标签: java arrays lambda 2d java-8


    【解决方案1】:

    你可以这样做:

    double[][] doubleArray = Arrays.stream(intArray)
                                   .map(arr -> Stream.of(arr).mapToDouble(Number::doubleValue).toArray())
                                   .toArray(double[][]::new);
    

    这可以分解如下:

    首先您使用Arrays.stream 创建一个Stream<Number[]>。然后对于每个Number[],您创建一个Stream<Number>,并使用mapToDouble 获取DoubleStream,然后使用toArray() 获取double[] 数组。

    最后的toArray 调用将此Stream<double[]> 转换为double[][] 数组。

    【讨论】:

      【解决方案2】:

      首先forEach 是终端运算符,返回类型为void,所以你不能使用

      stream().forEach(...).toArray();
      //                   ^void returned here, and void doesn't have `toArray` method
      

      您需要将map 您的数据放入double[] 行,然后将它们收集到double[][],这将我们带到您的第二个问题,因为toArray()(来自对象流)返回Object[] 数组,它可以'不存储在double[][] 引用中。你需要使用

      A[] toArray(IntFunction<A[]> generator)
      

      这将返回正确类型的数据,因此您可以使用

      toArray(size -> new double[size][])
      

      或更短的版本

      toArray(double[][]::new)
      

      您的代码如下所示:

      double[][] doubleArray = Arrays.stream(intArray)
              .map(
                      pArray -> Arrays
                      .stream(pArray)
                      .mapToDouble(d -> d.doubleValue())
                      .toArray()
              ).toArray(double[][]::new);
              //which is equivalent of
      //      ).toArray(size -> new double[size][]);
      
      //---[Test]---
      for (double[] row : doubleArray){
          System.out.println(Arrays.toString(row));
      }
      

      输出:

      [1.0, 2.0, 3.0]
      [4.0, 5.0, 6.0]
      [7.0, 8.0, 9.0]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-02
        • 2013-06-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多