【问题标题】:flatMap typing - attempting to merge DoubleStreamsflatMap 输入 - 尝试合并 DoubleStreams
【发布时间】:2017-03-22 10:07:13
【问题描述】:
    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(Function>) 的类型参数

写这个的正确方法是什么?我曾尝试从地图中发出 double[] ,但也无法实现。非常感谢。

【问题讨论】:

    标签: java java-8 java-stream flatmap


    【解决方案1】:

    您的代码中有一个小错误:您在a[i][j] 中混合了ij。 更改这些索引即可:

    double[] da = IntStream.range(0, numCols)
        .mapToObj(i -> IntStream.range(0, numRows).mapToDouble(j -> a[j][i]))
        .flatMapToDouble(d -> d)
        .toArray();
    

    您也可以使用flatMapToDouble(Function.identity()) 代替flatMapToDouble(d -> d)

    【讨论】:

    • 啊 - flatMapToDouble - 这就是我所缺少的。谢谢你们 - 太棒了!
    【解决方案2】:

    你也可以试试这个:

    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]

    【讨论】:

    • 请注意,这不会像 OP 要求的那样交错元素。顺便说一句,您可以使用 Arrays.stream(a).flatMapToDouble(Arrays::stream).toArray(); 将其缩短一点
    • 谢谢,没注意到。编辑答案以反映这一点。
    【解决方案3】:

    这似乎可以解决问题:

    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,而DoubleStream 可以轻松转换为double[]

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-04
      • 2021-03-06
      • 1970-01-01
      • 1970-01-01
      • 2013-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多