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]
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]