在Java

时间:2017-03-28 21:24:15

标签: java java-8 java-stream reduce

我是新手在java中使用流,所以这是我的问题。 我有一个double [] [],其中我想要执行元素的总和,因为它我跟随和Cro Linq类似,但似乎不起作用。

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

错误是acc似乎是double [],所以它不能执行double [] + double。 在C#Linq中,假定累加器与种子的类型相同(在这种情况下为0)。我错过了什么? 提前谢谢。

1 个答案:

答案 0 :(得分:5)

如果查看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();