如何通过Lambda高效累加Map中指定年份的BigDecimal销售额?
优化你的销售额累加Lambda代码
当然有办法简化步骤,而且这么做确实能提升效率——你当前的方案里,中间转成新Map的步骤完全是多余的!
简化后的代码
你可以直接在过滤后的流里映射出销售额,然后直接归约求和,不需要额外生成中间Map:
BigDecimal sales_for_timeframe = sales_by_year.entrySet().stream() .filter(entry -> years.contains(entry.getKey())) .map(Map.Entry::getValue) // 直接提取销售额,跳过中间Map .reduce(BigDecimal.ZERO, BigDecimal::add);
或者用Collectors.reducing的写法,效果完全一致,看你个人偏好:
BigDecimal sales_for_timeframe = sales_by_year.entrySet().stream() .filter(entry -> years.contains(entry.getKey())) .collect(Collectors.reducing(BigDecimal.ZERO, Map.Entry::getValue, BigDecimal::add));
步骤对比
原方案的步骤是:
- Map转流 → 2. 过滤 → 3. 收集为新Map → 4. Map的values转流 → 5. 归约求和
简化后只需要:
- Map转流 → 2. 过滤 → 3. 映射提取销售额 → 4. 归约求和
效率分析
原方案里的collect(Collectors.toMap)会额外创建一个新的Map实例,还要把符合条件的键值对写入这个Map,之后再遍历它的values集合——这不仅多了内存开销(存储中间Map),还多了一轮遍历操作。
简化后的方案直接在原流的管道里完成所有操作,没有多余的对象创建和遍历,无论是时间还是空间效率都更优,数据量越大,这种差异越明显。
所以当前的方案肯定不是最优解,上面的简化版本才是更高效更简洁的实现方式。
内容的提问来源于stack exchange,提问作者ryvantage
相关产品推荐
相关产品推荐

