使用Java流API的减法和

使用Java流API的减法和,java,java-8,java-stream,Java,Java 8,Java Stream,各位 我面临着一项任务,对我来说很简单,但我花了大约4个小时,什么都没有离开。假设我们有一个简单的整数列表,比如 [1,2,3,4,5] 我想得到每个元素的减法之和——对于这个列表,它将等于4->(2-1)+(3-2)。。。等等 为了避免回答带有范围的问题,列表可能如下所示: [5,12,16,25,25,48] 它总是在增长,但两者之间的范围不同 使用simple for不难获得以下内容: int result = 0; for (int i = 1; i < lst.s

各位

我面临着一项任务,对我来说很简单,但我花了大约4个小时,什么都没有离开。假设我们有一个简单的整数列表,比如

[1,2,3,4,5]

我想得到每个元素的减法之和——对于这个列表,它将等于4->(2-1)+(3-2)。。。等等

为了避免回答带有范围的问题,列表可能如下所示:

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

它总是在增长,但两者之间的范围不同

使用simple for不难获得以下内容:

    int result = 0;
    for (int i = 1; i < lst.size(); i++) {
        result += lst.get(i) - lst.get(i-1);
    }
int结果=0;
对于(inti=1;i
但当我试图用streams来解决这个问题时,我觉得自己非常愚蠢

这真的可能吗

尝试使用以下方法:

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

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

  • 创建列表
    [(n1-n0),(n2-n1),(n3-n2),…,(nN-nM)]
  • 对该列表求和:
    X=(n1-n0)+(n2-n1)+(n3-n2)+……+(nN-nM)
    。 这与
    X=(-n0)+(n1-n1)+(n2-n2)+……+完全相同(只是交换了括号的内部,因为它们无关紧要)(nM-nM)+nN]
  • 这就是(正如其他人指出的)
    X=nN-n0
    无论列表中有什么内容(空值除外)


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

    这基本上只是一个奇怪的查找循环。我用另一个列表示例编辑了这个问题。@AlbertZoich我的示例仍然很好,因为生成的intStream只包含指示您正在计算的是
    lst.get(lst.size()-1)-lst.get(0)
    -最后一个元素减去第一个元素。流用于一次处理一个项目。您希望处理项目并包括其邻居的上下文。使用流不是不可能的,但同样也没有理由使用它们。@Michael如果列表是
    [1,2,3,4,1]
    ,那么结果是0,它仍然是最后一个元素减去第一个元素。@Michael(2-1)+(3-2)+(4-3)+(1-4)等于0,所以khelwood的解仍然是works@khelwood的确如此。糟糕的数学。是的,我明白了。非常感谢。