如何使用Java';s溪?
是否可以使用Java的流来计算列表成员之间的(绝对)变化?如果是这样的话,它是如何更好地循环的(除了美学原因)?目前,我正在实施以下内容:如何使用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++) {
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
。