CANN/asc-devkit Tensor API Coshape布局函数
2026/7/15 15:21:18
在电商系统开发中,我们经常需要根据订单项中的商品ID状态进行过滤处理。本文将详细介绍两种高频使用场景的实现方法,从基础到进阶,帮助你掌握Stream API的精髓。
List<Order>collect=siteOrderList.stream().filter(order->{// 订单项中存在商品ID为空的order.getOrderItems().stream().filter(item->item.getSkuId()==null)}).collect(Collectors.toList());问题分析:filter()内部使用了无终止操作的stream,无法返回布尔值
// 找出订单项中存在商品ID为空的订单List<Order>ordersWithNullSku=siteOrderList.stream().filter(order->order.getOrderItems().stream().anyMatch(item->item.getSkuId()==null)).collect(Collectors.toList());关键点:
anyMatch()替代filter()作为终端操作anyMatch()返回boolean值,符合filter条件siteOrderList.stream().filter(order->{// 订单项中商品ID都不是空的List<OrderItem>collect1=order.getOrderItems().stream().filter(item->item.getSkuId()!=null).collect(Collectors.toList());});问题分析:缺少终端操作,collect未使用
// 找出订单项中商品ID都不是空的订单List<Order>ordersWithoutNullSku=siteOrderList.stream().filter(order->order.getOrderItems().stream().allMatch(item->item.getSkuId()!=null)).collect(Collectors.toList());核心技巧:
allMatch()确保所有元素满足条件noneMatch(item -> item.getSkuId() == null)List<Order>largeOrders=siteOrderList.parallelStream().filter(order->order.getOrderItems().parallelStream().allMatch(item->item.getSkuId()!=null)).collect(Collectors.toList());适用场景:
Map<Boolean,List<Order>>partitionedOrders=siteOrderList.stream().collect(Collectors.partitioningBy(order->order.getOrderItems().stream().allMatch(item->item.getSkuId()!=null)));List<Order>validOrders=partitionedOrders.get(true);List<Order>invalidOrders=partitionedOrders.get(false);优势:
publicMap<String,List<Order>>validateOrders(List<Order>orders){List<Order>validOrders=orders.stream().filter(order->order.getOrderItems().stream().allMatch(item->item.getSkuId()!=null)).collect(Collectors.toList());List<Order>invalidOrders=orders.stream().filter(order->order.getOrderItems().stream().anyMatch(item->item.getSkuId()==null)).collect(Collectors.toList());returnMap.of("valid",validOrders,"invalid",invalidOrders);}| 订单类型 | 数量 | 占比 |
|---|---|---|
| 有效订单 | 1,245 | 82.3% |
| 无效订单 | 270 | 17.7% |
匹配操作选择:
anyMatch():存在至少一个满足条件的元素allMatch():所有元素都满足条件noneMatch():没有元素满足条件性能优化原则:
可读性提升技巧:
// 提取Predicate提升可读性Predicate<OrderItem>hasValidSku=item->item.getSkuId()!=null;List<Order>validOrders=orders.stream().filter(order->order.getOrderItems().stream().allMatch(hasValidSku)).collect(Collectors.toList());经验分享:在实际项目中,这类过滤操作可封装为独立方法,结合Spring的
@Service注解实现复用。例如订单校验服务、库存预检服务等场景均可使用此模式。
通过掌握这些Stream API技巧,你可以显著提升订单处理逻辑的简洁性和执行效率,让代码既优雅又高效!