【发布时间】:2014-06-25 11:51:46
【问题描述】:
伙计们,
考虑以下示例,给定一个 Trade 对象列表,我的代码需要返回一个数组,其中包含 24 小时、7 天、30 天和所有时间的交易量。
使用普通的旧迭代器,这只需要对集合进行一次迭代。
我正在尝试使用 Java 8 流和 Lambda 表达式来做同样的事情。我想出了这段代码,它看起来很优雅,运行良好,但需要对列表进行 4 次迭代:
public static final int DAY = 24 * 60 * 60;
public double[] getTradeVolumes(List<Trade> trades, int timeStamp) {
double volume = trades.stream().mapToDouble(Trade::getVolume).sum();
double volume30d = trades.stream().filter(trade -> trade.getTimestamp() + 30 * DAY > timeStamp).mapToDouble(Trade::getVolume).sum();
double volume7d = trades.stream().filter(trade -> trade.getTimestamp() + 7 * DAY > timeStamp).mapToDouble(Trade::getVolume).sum();
double volume24h = trades.stream().filter(trade -> trade.getTimestamp() + DAY > timeStamp).mapToDouble(Trade::getVolume).sum();
return new double[]{volume24h, volume7d, volume30d, volume};
}
我怎样才能在列表上只使用一次迭代来达到同样的效果?
【问题讨论】:
-
总的问题是:为什么您只想在一次迭代中完成它?
-
因为它更高效。
-
不!这不是更有效!我问了这个问题,正如我所期望的那样。而且您的假设是不正确的:谁说每次执行一次操作的两次迭代一定比一次执行两次操作的迭代效率低?
-
考虑我有 1,000,000 笔交易和 100 种不同的交易量要计算并且方法 trade.getTimestamp() 很昂贵的情况。使用迭代器我只需要调用它 1,000,000 次,而使用 lambda 我需要调用它 1 亿次。
-
我建议您比较/测量性能,看看它有什么不同。将测试放在一起应该很容易。在哪种情况下使用循环可能会产生很大的不同,或者在哪种情况下使用您认为更清晰的方式可能会有所不同。
标签: java lambda java-8 java-stream