使用Streams同时计算总和和平方和

时间:2016-05-20 16:02:11

标签: java java-8 java-stream

我想知道是否有任何方法可以在数组的单次迭代中实现以下内容。只需要有两个不同的结果流出。

double sum = Arrays.stream(doubles).sum();
double sumOfSquares = Arrays.stream(doubles).map(d -> d * d).sum();

1 个答案:

答案 0 :(得分:13)

嗯,您可以使用自定义收集器,例如:

double[] res =
    Arrays.stream(doubles)
          .collect(() -> new double[2],
                   (arr, e) -> {arr[0]+=e; arr[1]+=e*e;},
                   (arr1, arr2) -> {arr1[0]+=arr2[0]; arr1[1]+=arr2[1];});

double sum = res[0];
double sumOfSquares = res[1];

但是我认为你没有太多的可读性,所以我会坚持多次通过解决方案(或者在这种情况下可能只使用for循环)。