如何使用Java';s溪?

如何使用Java';s溪?,java,java-stream,Java,Java Stream,是否可以使用Java的流来计算列表成员之间的(绝对)变化?如果是这样的话,它是如何更好地循环的(除了美学原因)?目前,我正在实施以下内容: List<Double> series; // Populated with, e.g., time series data List<Double> seriesChanges = new ArrayList<>(); for (int i = 1; i < series.size(); i++) {

是否可以使用Java的流来计算列表成员之间的(绝对)变化?如果是这样的话,它是如何更好地循环的(除了美学原因)?目前,我正在实施以下内容:

List<Double> series; // Populated with, e.g., time series data

List<Double> seriesChanges = new ArrayList<>();

    for (int i = 1; i < series.size(); i++) {
        seriesChanges.add(Math.abs(series.get(i-1) - series.get(i)));
    }
列表系列;//例如,使用时间序列数据填充
列表序列更改=新建ArrayList();
对于(int i=1;i
Smth如下所示:

IntStream.range(1,series.size()).forEach(i->seriechanges.add(Math.abs(series.get(i-1)-series.get(i))


但我同意@JB Nizet的观点,即阅读稍微不同的解决方案确实很困难,它不依赖于可变列表上的副作用:

IntStream.range(1, series.size())
         .mapToObj(i -> Math.abs(series.get(i - 1) - series.get(i)))
         .collect(Collectors.toList())

我只能想到一个在这里使用Streams API的原因:它更容易并行化(只需加入
.parallel()
,也许还可以使用一个不可修改的列表……我没有尝试过)。

是的,这是可能的,但它会像现在一样更加复杂,可读性也会降低,同时仍然在做同样的事情。好的,没有简单的方法。映射和收集比使用
forEach
添加到集合中更好。请发布一个示例。在这种情况下,您将如何处理
i-1
i
元素?方法与您所做的相同:
range(…).map(i->Math.abs(series.get(i-1)-series.get(i))).collect(Collectors.toList())
。您尝试过此代码吗?它给出编译错误
类型不匹配:无法从double转换为int
确定,使用
mapToObj
而不是
map