Можно ли использовать потоки 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)));
    }
2
basse 6 Апр 2017 в 09:37

2 ответа

Лучший ответ

Немного другое решение, которое не зависит от побочных эффектов в изменчивом списке:

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

Я могу придумать только одну причину использовать API Streams здесь: проще распараллелить (просто добавьте .parallel() и, возможно, используйте неизменяемый список ... Я не пробовал).

2
stholzm 6 Апр 2017 в 07:58

Что-то вроде этого:

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

Но я согласен с @JB Nizet, что это действительно трудно читать

0
Ivan Pronin 6 Апр 2017 в 06:52