题⽬ 4:订单商品统计:

发布时间:2026/5/27 5:24:40

题⽬ 4:订单商品统计: 核⼼考点对象聚合订单包含商品列表、 MapString, ListOrder 、销量 / 营业额 统计、Stream ⾼阶⽤法题⽬要求 1. Item 商品名称、单价、数量 → 提供⼩计⾦额⽅法 2. Order 订单订单号、⽤户 ID、商品列表 ListItem → 提供订单总⾦额⽅法 3. 按⽤户 ID分组订单Map⽤户→订单列表 4. 统计每个⽤户总消费、平台总营业额、销量最⾼的商品。打印结果: ⽤户消费统计 ⽤户U002 总消费3999.00元 ⽤户U001 总消费7096.00元 平台总营业额11095.00元 销量最⾼商品⼿机总销量2思路分析一、Item 类 商品class Item { private String name; // 商品名手机、电脑 private double price; // 单价 private int count; // 购买数量 // 小计金额 单价 × 数量题目要求必须提供的方法 public double getSubtotal() { return price * count; } // 构造方法创建商品时传入 名称、单价、数量 public Item(String name, double price, int count) { this.name name; this.price price; this.count count; } // getter外部要读取商品信息必须用get public String getName() { return name; } public int getCount() { return count; } }核心思路tem 是基础数据单元只负责自己的单价、数量、小计。getSubtotal()是题目强制要求单个商品的总价。提供 getter让外部类Order能读取商品名称、数量。二、Order 类订单class Order { private String orderId; // 订单编号 O001 private String userId; // 用户编号 U001 private ListItem itemList; // 一个订单包含多个商品 → 对象聚合 // 订单总金额 所有商品的小计加起来题目要求 public double getTotalAmount() { return itemList.stream() .mapToDouble(Item::getSubtotal) // 把每个商品转成小计金额 .sum(); // 求和 } // 构造方法创建订单时传入 订单号、用户ID、商品列表 public Order(String orderId, String userId, ListItem itemList) { this.orderId orderId; this.userId userId; this.itemList itemList; } // getter public String getUserId() { return userId; } public ListItem getItemList() { return itemList; } }核心思路对象聚合核心考点一个订单 包含 多个商品代码体现ListItem itemListgetTotalAmount() 订单总金额流处理商品列表mapToDouble(Item::getSubtotal)把每个商品 → 金额sum()把所有金额加起来 订单总价三、主程序完整执行流程最关键第 1 步构造测试数据// 商品 Item phone new Item(手机, 1999, 1); Item phone2 new Item(手机, 1999, 1); Item computer new Item(电脑, 5099, 1); Item earphone new Item(耳机, 1999, 1); // 订单 Order o1 new Order(O001, U001, Arrays.asList(phone, computer)); Order o2 new Order(O002, U001, Arrays.asList(earphone)); Order o3 new Order(O003, U002, Arrays.asList(phone2)); // 所有订单放到一个集合里 ListOrder orderList Arrays.asList(o1, o2, o3);思路先造商品再造订单订单里装入商品最后把所有订单放到orderList方便统一处理第 2 步按用户 ID 分组订单MapString, ListOrderMapString, ListOrder userOrderMap orderList.stream() .collect(Collectors.groupingBy(Order::getUserId));思路Stream 分组核心groupingBy(Order::getUserId)按照userId分组key 用户 IDvalue 这个用户的所有订单列表第 3 步统计每个用户总消费userOrderMap.forEach((userId, orders) - { double total orders.stream() .mapToDouble(Order::getTotalAmount) // 每个订单 → 金额 .sum(); // 求和 该用户总消费 System.out.printf(用户%s 总消费%.2f元%n, userId, total); });思路遍历每个用户把该用户的所有订单金额加起来输出格式化结果第 4 步统计平台总营业额double platformTotal orderList.stream() .mapToDouble(Order::getTotalAmount) .sum(); System.out.printf(平台总营业额%.2f元%n, platformTotal);思路把所有订单的金额加起来就是平台总营业额最简单的统计第 5 步统计销量最高的商品最难Stream 高阶第一步把所有订单里的商品全部展开orderList.stream() .flatMap(order - order.getItemList().stream())思路flatMap 扁平化把订单1[商品1,商品2]、订单2[商品3]变成[商品1,商品2,商品3]第二步按商品名统计总销量.collect(Collectors.groupingBy( Item::getName, // 按商品名分组 Collectors.summingInt(Item::getCount) // 每组数量求和 ));得到一个 Map手机 → 2电脑 → 1耳机 → 1第三步找出销量最大的那个Map.EntryString, Integer topItem itemSalesMap.entrySet().stream() .max(Map.Entry.comparingByValue()) // 按销量值比较取最大 .orElse(null);思路比较 Map 里的 value销量取出最大的那一组最后打印商品名 销量

相关新闻