根据产品数量更新订单项

  • 本文关键字:更新 单项 java
  • 更新时间 :
  • 英文 :


我有两个类Order&订单项如下

public class Order {
private String orderId;
private List<OrderItem> orderItems;
}
public class OrderItem {
String productId;
Long price;
Integer quantity;
}

我想实现基于产品数量的功能更新orderItems基于此要求:当用户更新项目数量时,如果在给定订单中找不到给定产品,则将这些项目新添加到订单中。如果给定订单中的给定数量为零,则从订单中删除这些项目。否则,更新订单项目的数量。

我的算法对此要求如下:

List<OrderItem> request
List<OrderItem> data

根据请求处理

  • 将数量为0的任何req项过滤到集合名称deletedItems中
  • 其余请求集合用于更新&插入
  • 将中的rest req集合转换为Map<productId,订单项>

数据处理

  • 使用deletedItems筛选数据项
  • rest集合迭代更新,如果映射中存在productId,则更新,从映射中删除该项
  • 将Map其余部分中的新项插入数据项
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)));
}

我的算法可以吗?有什么改进的建议吗?感谢

这里有一个简单的方法

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);
}
});
}

最新更新