【问题标题】:2D Array stream reduce in javajava中的二维数组流减少
【发布时间】:2017-08-22 03:45:15
【问题描述】:

我是在 java 中使用流的新手,我对使用流有疑问。 我有一个 double[][] 我想在其中执行元素的求和,为此我编写了类似于 C#Linq 的以下方法,但它似乎不起作用。

Arrays.stream(myArray).reduce(0,(acc, i) -> acc + Arrays.stream(i).sum());

错误是acc好像是double[],所以不能执行double[]+double。 在 C#Linq 中,累加器被假定为与种子相同的类型(在本例中为 0)。我在这里想念什么? 提前致谢。

【问题讨论】:

    标签: java java-8 java-stream reduce


    【解决方案1】:

    如果您查看reduce 的签名,身份的类型必须是流元素的类型。在这种情况下是double[]。这也会给acc 提供double[] 的类型。

    有一个重载,您可以提供不同类型的累加器,但您还需要传递一个组合器来组合 2 个累加器。

    你可以这样做:

    double result = Arrays.stream(myArray)
        .reduce(0D, (acc, i) -> acc + Arrays.stream(i).sum(), Double::sum);
    

    其中0Ddouble 文字,Double::sum 用于组合2 个累加器。

    或者,这样做可能更方便:

    double result = Arrays.stream(myArray)
        .flatMapToDouble(DoubleStream::of)
        .sum();
    

    【讨论】:

    • flatMap 是最干净的方法。
    • 我更喜欢Arrays.stream(myArray) .flatMapToDouble(Arrays::stream) .sum();,因为这不是可变参数用例。而Arrays::stream 甚至比DoubleStream::of 还要短……
    猜你喜欢
    • 1970-01-01
    • 2014-05-01
    • 2011-03-25
    • 2012-02-04
    • 1970-01-01
    • 2021-05-20
    • 2016-12-21
    • 2013-04-15
    • 1970-01-01
    相关资源
    最近更新 更多