我有 2 个类 Order & OrderItem 如下
public class Order {
private String orderId;
private List<OrderItem> orderItems;
}
public class OrderItem {
String productId;
Long price;
Integer quantity;
}
我想根据这个要求实现基于产品数量的功能更新订单项目:当用户更新项目数量时,如果在给定订单中找不到给定产品,则将这些项目新添加到订单中。如果给定数量是零在给定的顺序,从订单中删除这些项目。否则更新订单商品的数量。
我对此要求的算法如下:
List<OrderItem> request
List<OrderItem> data
<块引用>
按要求处理
数据处理
void updateItems(List<OrderItem> request, List<OrderItem> data) {
Set<String> deletedItems = new HashSet();
Map<String, OrderItem> reqItems = request.stream()
.map(x -> {
if(x.getQuantity() == 0) {
deletedItems.add(x.getProductId());
}
return x;
})
.filter(x -> x.getQuantity() > 0)
.collect(Collectors.toMap(OrderItem :: getProductId, x -> x));
data.stream()
.filter(x -> !deletedItems.contains(x.getProductId()))
.map(x -> {
String productId = x.getProductId();
if(reqItems.containsKey(productId)) {
x.setQuantity(reqItems.get(productId).getQuantity());
reqItems.remove(productId);
};
return x;
})
.collect(Collectors.toList());
reqItems.entrySet().stream()
.forEach(x -> data.add(new OrderItem(x)));
}
我的算法可以吗?有什么改进建议吗?谢谢
答案 0 :(得分:1)
这里有一个简单的方法
void updateItems(List<OrderItem> request, List<OrderItem> data) {
request.forEach(r -> {
final Optional<OrderItem> exitsOrder = data.stream().filter(d -> d.getProductId().equalsIgnoreCase(r.getProductId())).findFirst();
if (exitsOrder.isPresent()) {
if (r.getQuantity() == 0) {
data.remove(exitsOrder.get());
} else {
exitsOrder.get().setQuantity(r.getQuantity());
}
} else {
data.add(r);
}
});
}