Calculate time between dates in a list

I would like to calculate the time between dates in ArrayListusing java 8 lambda expressions. Over time between dates, I mean: Date i - Date i-1, Date i-1 - Date i-2, etc. I use java.util.Date.

I already use this code in java 7, but I'm just wondering if streaming can shorten this:

List<Date> dates = transactions.stream().map(Transaction::getTimestampEnd).sorted((d1, d2) -> d1.compareTo(d2)).collect(Collectors.toList());
List<Long> interArrivalTimes = new ArrayList<>();
AtomicInteger counter = new AtomicInteger();
dates.forEach(d -> {

    int count = counter.getAndIncrement();
    if (count != 0) {

        Date previousDate = dates.get(count-1);
        long time = d.getTime()-previousDate.getTime();

        interArrivalTimes.add(time);
    }

});
double mean = interArrivalTimes.stream().mapToLong(i -> i).average().getAsDouble();

After I got a list of time differences, I want to calculate the average. But this is more about the cycle, which I would like to shorten. Maybe something with a reduction or assembly?

Any help is much appreciated!

+4
source share
1 answer

You can pass indexes instead of dates:

IntStream.range(1, dates.size())
        .mapToLong(i -> dates.get(i).getTime() - dates.get(i - 1).getTime())
        .average().getAsDouble();

:

LongStream.Builder b = LongStream.builder();
for (int i = 1; i < dates.size(); i++) {
  b.accept(dates.get(i).getTime() - dates.get(i - 1).getTime());
}
double mean = b.build().average().getAsDouble();

:

double mean = 0;
for (int i = 1; i < dates.size(); i++) {
  mean += dates.get(i).getTime() - dates.get(i - 1).getTime();
}
if (!dates.isEmpty()) mean /= dates.size();
+4

Source: https://habr.com/ru/post/1613667/


All Articles