【发布时间】:2015-10-29 14:45:03
【问题描述】:
我想使用 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();
获得时差列表后,我想计算平均值。但更多的是关于我想缩短的循环部分。也许有减少或收集的东西?
非常感谢任何帮助!
【问题讨论】:
-
几乎总是,当您在排序操作中引用
compareTo方法时,例如在您的.sorted((d1, d2) -> d1.compareTo(d2))中,您可能会做一些过时的事情。当您的元素是Comparable时,只需使用不带参数的sorted()。 -
感谢您的评论!我会记住这一点。
标签: java date java-8 java-stream