计算列表中日期之间的时间

时间:2015-10-29 14:45:03

标签: java date java-8 java-stream

我想使用java 8 lambda表达式计算ArrayList中日期之间的时间。我的意思是日期之间的时间:日期i - 日期i-1,日期i-1 - 日期i-2等等我正在使用java.util.Date

我已经在java 7中使用了这个代码,但我很好奇,如果流媒体可以缩短它:

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();

在我获得时差列表后,我想计算平均值。但更多的是关于我想缩短的循环部分。也许有减少或收集的东西?

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:4)

您可以流式传输索引而不是日期:

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

或者使用旧的for循环:

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();