我有两个类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);
}
});
}