final double[][] a = new double[][] { { 1, 2, 3 }, { 4, 5, 6 } };
final int numRows = a.length;
final int numCols = a[0].length;
final double[] da = IntStream.range(0, numCols)
.mapToObj(i -> IntStream.range(0, numRows).mapToDouble(j -> a[i][j])).flatMap(d -> d)
.toArray(double[]::new);
// da should be [1, 4, 2, 5, 3, 6]
错误是:无法推断flatMap的类型参数(函数>)
写这个的正确方法是什么?我已经尝试从地图中发出double [],但也无法实现。非常感谢。
答案 0 :(得分:3)
您的代码中存在一些小错误:您在i
中混合了j
和a[i][j]
。
改变这些指数你可以得到它:
double[] da = IntStream.range(0, numCols)
.mapToObj(i -> IntStream.range(0, numRows).mapToDouble(j -> a[j][i]))
.flatMapToDouble(d -> d)
.toArray();
相反flatMapToDouble(d -> d)
您也可以使用flatMapToDouble(Function.identity())
。
答案 1 :(得分:3)
你也可以试试这个:
final double[][] a = new double[][] { { 1, 2, 3 }, { 4, 5, 6 } };
final double[] da = Arrays.stream(a)
.flatMapToDouble(Arrays::stream)
.toArray();
它生成一个流流然后平面映射它。这样做的好处是你可以拥有任何大小的嵌套数组。
注意:正如Alexis C所指出的那样,它并没有交错元素。您将按照元素在原始数组中的顺序获得结果。例如。 [1, 2, 3, 4, 5, 6]
答案 2 :(得分:2)
这似乎可以解决问题:
final double[] da = IntStream.range(0, numCols)
.mapToObj(i -> IntStream.range(0, numRows).mapToDouble(j -> a[j][i])).flatMapToDouble(d -> d)
.toArray();
输出:
[1.0, 4.0, 2.0, 5.0, 3.0, 6.0]
请注意,flatMap
无效,因为它希望将您的中间Stream<DoubleStream>
映射到Stream<SomeReferenceType>
,这对您的映射功能是不可能的。
使用flatMapToDouble
会将Stream<DoubleStream>
转换为DoubleStream
,可以轻松转换为double[]
。