如何在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
相关产品推荐
相关产品推荐

