Java 8 Lambda 将 Number[][] 转换为 double[][]

Java 8 Lambda to convert Number[][] to double[][]

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) : Returns Integer[] 流
forEach:对于每个 Integer[],创建一个 Integer 流,将每个 Integer 转换为 double 并 returning a double[]。
for each 创建了 double[],我认为外部 toArray 会 return 这个 double[] 的数组
我怎样才能让它工作?

您可以这样做:

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[][] 数组。

首先,forEach 是 return 类型 void 的终端运算符,因此您不能使用

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

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

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

这将 return 更正数据类型,因此您可以使用

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]