flatMap输入 - 尝试合并DoubleStreams

时间:2017-03-22 10:07:13

标签: java java-8 java-stream flatmap

    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 [],但也无法实现。非常感谢。

3 个答案:

答案 0 :(得分:3)

您的代码中存在一些小错误:您在i中混合了ja[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[]