加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java Lambda表达式可避免多次迭代

发布时间:2020-12-15 00:54:35 所属栏目:Java 来源:网络整理
导读:伙计们, 考虑以下示例,给定一个Trade对象列表,我的代码需要返回一个包含交易量24小时,7天,30天和所有时间的数组. 使用普通的旧迭代器,这只需要对集合进行一次迭代. 我正在尝试使用Java 8流和Lambda表达式来做同样的事情.我想出了这个代码,它看起来很优雅,工
伙计们,

考虑以下示例,给定一个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};
}

如何在列表中仅使用一次迭代来实现相同的目标?

解决方法

此问题类似于“摘要统计信息”收集器.看一下IntSummaryStatistics类:
public class IntSummaryStatistics implements IntConsumer {
    private long count;
    private long sum;
    ...

    public void accept(int value) {
        ++count;
        sum += value;
        min = Math.min(min,value);
        max = Math.max(max,value);
   }

   ...

}

它旨在与collect()一起使用;这是IntStream.summaryStatistics()的实现

public final IntSummaryStatistics summaryStatistics() {
    return collect(IntSummaryStatistics::new,IntSummaryStatistics::accept,IntSummaryStatistics::combine);
}

编写像这样的收集器的好处是您的自定义聚合可以并行运行.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读