使用Java Stream API减法的总和

时间:2017-07-28 13:02:05

标签: java java-8 java-stream

大家。

我已经面临一项任务,对我来说看起来很简单,但我花了4个小时而一无所有。所以,我们假设我们有简单的整数列表,如

[1, 2, 3, 4, 5]

我希望得到每个元素的减法总和 - 对于这个列表,它将等于4 - > (2 - 1)+(3 - 2)......依此类推。

为了避免使用范围答案,列表可能如下所示:

[5, 12, 16, 25, 25, 48]

它一直在增长,但两者之间的范围不一样。

使用简单的 它不难得到类似的东西:

    int result = 0;
    for (int i = 1; i < lst.size(); i++) {
        result += lst.get(i) - lst.get(i-1);
    }

但是当我尝试使用流来解决这种情况时,我感觉自己完全愚蠢。

这实际上可行吗?

2 个答案:

答案 0 :(得分:4)

假设您有一个像这样的整数列表:[ n0, n1, n2, ... , nM, nN ],您正在做的是:

  1. 创建列表[(n1 - n0), (n2 - n1), (n3 - n2), ..., (nN - nM)]
  2. 总结该列表:X = (n1 - n0) + (n2 - n1) + (n3 - n2) + ... + (nN - nM)。 这是完全相同的(只是交换了括号内部,因为它们无关紧要)为X = (-n0) + (n1 - n1) + (n2 - n2) + ... + (nM - nM) + nN ]
  3. (正如其他人指出的那样)X = nN - n0无论您的列表中有什么内容 null 除外)。

    因此,到目前为止,lst.get(lst.size()-1) - lst.get(0)是最佳答案。

答案 1 :(得分:2)

尝试使用:

int result = IntStream.range(1, lst.size())  // creates a stream of indexes from 1 to lst.size()
        .map(i -> lst.get(i) - lst.get(i-1)) // maps the new value into a new stream
        .sum();                              // sums it up