You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Stream内部使用Comparator获取HashMap中最便宜的Car

用Stream获取HashMap中最便宜的Car

我有一个HashMap:

Map<Car, Integer> vehicles = new HashMap<Car, Integer>();

需要使用Stream返回该Map中最便宜的Car。Car类有一个返回价格的方法:

double calcCost() {
    return price;
}

限制条件:不能在Stream外部使用Comparator,必须在Stream内部使用。以下是我的尝试:

this.vehicles
    .entrySet()
    .stream()
    .sorted(Map.Entry.comparingByKey(Comparator.comparing(Car::calcCost)));

解决方案

你的代码仅完成了排序操作,没有提取最终目标结果。可以直接借助Stream的min方法高效找到价格最低的Car,同时满足Comparator在Stream内部使用的要求:

方式一:直接遍历Map的Key集合

Optional<Car> cheapestCar = vehicles.keySet()
    .stream()
    .min(Comparator.comparingDouble(Car::calcCost));

方式二:延续你的EntrySet处理思路

Optional<Car> cheapestCar = vehicles.entrySet()
    .stream()
    .min(Map.Entry.comparingByKey(Comparator.comparingDouble(Car::calcCost)))
    .map(Map.Entry::getKey);

补充说明

  • min方法仅需遍历一次集合即可找到最小元素,时间复杂度为O(n),比先排序(O(n log n))再取首元素的效率更高
  • 使用comparingDouble而非comparing,专门适配double类型的价格比较,避免自动装箱带来的潜在问题
  • 返回Optional<Car>是为了处理Map为空的场景,保证代码的健壮性
  • 所有Comparator的定义均直接作为Stream方法的参数传入,完全符合“在Stream内部使用”的要求

内容的提问来源于stack exchange,提问作者Nikita Gelfman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 05:57:41