
本文介绍如何利用 java stream api 高效判断一组订单是否可在现有库存中全部满足,核心是将库存按商品名聚合为映射表,再逐条校验订单需求数量是否不超过对应库存。
本文介绍如何利用 java stream api 高效判断一组订单是否可在现有库存中全部满足,核心是将库存按商品名聚合为映射表,再逐条校验订单需求数量是否不超过对应库存。
在电商、仓储或供应链系统中,一个常见需求是:给定一份订单列表(List
使用传统循环虽可行,但借助 Stream API 可写出更简洁、函数式且可读性强的解决方案。关键在于将非结构化的库存列表转换为以商品名为键、总库存量为值的 Map
✅ 推荐实现:用 Collectors.groupingBy 处理重复商品名
库存中同一商品可能多次出现(例如多个批次的 "apple"),因此应汇总其总量:
Map<string integer> stockMap = productList.stream()
.collect(Collectors.groupingBy(
Product::getName,
Collectors.summingInt(Product::getAmount)
));</string>
随后遍历订单,逐条比对:
boolean isFulfillable = orderList.stream()
.allMatch(order ->
stockMap.getOrDefault(order.getName(), 0) >= order.getAmount()
);
System.out.println("订单可履行: " + isFulfillable); // 输出: false(因 juice 需 3 但只有 2,milk 需 5 但只有 4)
? allMatch() 返回 true 当且仅当所有订单项均满足库存条件;一旦某项不满足即短路返回 false,效率更高。
⚠️ 注意事项与优化建议
-
商品名唯一性假设:若业务保证 productList 中每个 Product.name 唯一(无重复),可用更轻量的 toMap 替代:
Map<string integer> stockMap = productList.stream() .collect(Collectors.toMap(Product::getName, Product::getAmount));</string>但此写法在遇到重复商品名时会抛出 IllegalStateException,务必确保数据前提成立。
空值安全:使用 getOrDefault(key, 0) 避免 NullPointerException —— 若订单中存在库存未记录的商品(如 "banana"),默认库存为 0,自然判定为不可履行。
-
扩展性考虑:如需返回具体缺货详情(如 "juice: required 3, available 2"),可改用 map() + filter() 收集不满足项:
List<string> shortages = orderList.stream() .filter(order -> stockMap.getOrDefault(order.getName(), 0) String.format("%s: required %d, available %d", order.getName(), order.getAmount(), stockMap.getOrDefault(order.getName(), 0))) .toList();</string>
综上,Stream API 不仅让逻辑清晰可读,还天然支持惰性求值与函数组合。掌握 groupingBy + summingInt 和 allMatch 的组合模式,是处理此类“多对一匹配与聚合校验”问题的典型范式。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











